go - 在这个例子中如何理解 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.")
}
}
解决方案
goroutine 之间没有执行顺序保证,除非它们使用通道等同步机制相互通信。你创建了两个 goroutine,然后等到你收到一个来自 的字符串ch
,或者从 接收t
。两个 goroutine 之间没有显式同步,因此它们可以在单个线程中以任意顺序执行,也可以同时在不同线程上执行。select 语句将从第一个包含内容的通道中读取。
推荐阅读
- mysql - MYSQL 计算列上的所有大小写
- c++ - 在c++程序下运行
- python - docker 上的内存使用量在容器 timeoutErrors 上达到峰值
- mongodb - 将 shell 变量传递给 mongodb 脚本
- r - 无法使用 install.packages
- python - 微调 T5 以使用 HuggingFace 进行汇总时出现关键错误
- javascript - 从一个客户端发送数据的 Web 套接字
- docker - 在 VSCode 远程容器会话中覆盖 UID GID
- regex - Powershell正则表达式替换两个相同字符之间的特定字符
- flutter - 获取 dart 中当前脚本的路径