首页 > 后端开发 > Golang > 正文

为什么 Go Playground 和本地机器上的 Goroutine 表现出行为差异?

Barbara Streisand
发布: 2024-10-23 17:05:01
原创
180 人浏览过

Why Do Goroutines on Go Playground and Local Machines Exhibit Behavioral Differences?

Go Playground 和本地计算机之间的差异

在 Go Playground 上运行代码时,开发人员可能会遇到与在本地计算机上运行相同代码相比的差异。本文探讨了行为差异,特别是在处理 goroutine 和同步机制时。

案例研究:Go Playground 与本地机器上的代码行为

考虑以下 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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!