首页 > 解决方案 > 在这个例子中如何理解 goroutines 的执行?

问题描述

我试图了解 goroutines 以及它是如何工作的。在下面的示例中,我有两个 go 例程,每个例程都通过通道发送一些消息。我期望通道 ch 将首先发送消息,但是为什么 go readword(ch) 在 go timeout(t) 之后执行。如果我在 main 函数中更改 go 例程调用的顺序,那么 readword(ch) 将首先执行。我对 go 例程感到非常困惑?有什么帮助吗?

func readword(ch chan string) {

    fmt.Println("Type a word, then hit Enter.")
    var word string
    fmt.Scanf("%s", &word)
    ch <- word
}

func timeout(t chan bool) {
    t <- false
}

func main() {
    ch := make(chan string)
    go readword(ch)

    t := make(chan bool)
    go timeout(t)

    select {
    case word := <-ch:
        fmt.Println("Received", word)
    case <-t:
        fmt.Println("Timeout.")
    }
}

标签: go

解决方案


goroutine 之间没有执行顺序保证,除非它们使用通道等同步机制相互通信。你创建了两个 goroutine,然后等到你收到一个来自 的字符串ch,或者从 接收t。两个 goroutine 之间没有显式同步,因此它们可以在单个线程中以任意顺序执行,也可以同时在不同线程上执行。select 语句将从第一个包含内容的通道中读取。


推荐阅读