在 Go Playground 上运行代码时,开发人员可能会遇到与在本地机器上运行相同代码相比的差异。本文探讨了行为差异,特别是在处理 goroutine 和同步机制时。
考虑以下 Go 代码:
package main
import (
"fmt"
)
func other(done chan bool) {
done 在 Go Playground 上,此代码会产生错误:“进程花费的时间太长。”这表明在另一个函数中创建的 goroutine 无限期地运行。
但是,在具有多个 CPU 核心 (GOMAXPROCS > 1) 的本地计算机上运行相同的代码会产生以下输出:
Hello, playground
Finished.
这意味着当主 Goroutine 完成时,在其他 Goroutine 中创建的 Goroutine 也会终止。
解释行为差距
Go Playground 和本地机器之间的不同行为可以归因于可用处理器的数量。在 Go Playground 上,GOMAXPROCS 默认为 1,这意味着一次只能运行一个 Goroutine。因此,在上面的例子中,other内创建的无尽的goroutine会阻止主goroutine继续执行。
相反,当本地多CPU核运行时,GOMAXPROCS默认为可用核数,允许多个goroutine同时运行。因此,在 other 中创建的无限 goroutine 不会阻止主 goroutine 退出。
结论
Go 中 goroutine 的行为取决于可用处理器的数量 (GOMAXPROCS)。虽然 Go Playground 使用默认值 1,这可能会导致 goroutine 无限期运行的感觉,但在具有多个内核的本地计算机上运行相同的代码会提供不同的行为,其中 goroutine 可能会在主 goroutine 完成时终止。这种理解有助于开发人员避免误解并确保他们的代码在不同环境中按预期运行。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3