在 Go Playground 上运行代码时,开发人员可能会遇到与在本地计算机上运行相同代码相比的差异。本文探讨了行为差异,特别是在处理 goroutine 和同步机制时。
考虑以下 Go 代码:
<code class="go">package main import ( "fmt" ) func other(done chan bool) { done <- true go func() { for { fmt.Println("Here") } }() } func main() { fmt.Println("Hello, playground") done := make(chan bool) go other(done) <-done fmt.Println("Finished.") }</code>
在 Go Playground 上,此代码会产生错误:“进程花费的时间太长。”这表明在另一个函数中创建的 goroutine 无限期地运行。
但是,在具有多个 CPU 核心的本地计算机上运行相同的代码 (GOMAXPROCS > 1) 会产生以下输出:
<code class="text">Hello, playground Finished.</code>
这意味着在主协程完成时,在其他协程中创建的协程也会终止。
Go 游乐场和本地机器之间的不同行为可以归因于可用处理器的数量。在 Go Playground 中,GOMAXPROCS 默认为 1,这意味着一次只能运行一个 Goroutine。因此,在上面的例子中,在 other 中创建的无尽 Goroutine 会阻止主 Goroutine 继续运行。
相反,当本地运行多个 CPU 核心时,GOMAXPROCS 默认为可用核心数,允许多个 Goroutine同时运行。因此,在 other 中创建的无限 Goroutine 不会阻止主 Goroutine 退出。
Go 中 Goroutine 的行为取决于可用处理器的数量(GOMAXPROCS)。虽然 Go Playground 使用默认值 1,这可能会导致 goroutine 无限期运行的感觉,但在具有多个内核的本地计算机上运行相同的代码会提供不同的行为,其中 goroutine 可能会在主 goroutine 完成时终止。这种理解有助于开发人员避免误解,并确保他们的代码在不同环境中按预期运行。
以上是为什么 Go Playground 和本地机器上的 Goroutine 表现出行为差异?的详细内容。更多信息请关注PHP中文网其他相关文章!