Go Playground 和 Go on Your Machine 之间的差异:Goroutine 执行
为了解决有关 Goroutine 执行的混乱,在两者上都执行了代码片段Go Playground 和本地机器。 Playground 产生错误“进程花费太长时间”,建议创建一个永久运行的 Goroutine,而本地机器几乎产生即时输出。这就提出了一个问题:当主 Goroutine 完成时,other() 函数中的 Goroutine 是否退出,还是继续在后台运行。
说明
On the Go Playground ,GOMAXPROCS 设置为 1。这表示一次只执行一个 Goroutine。如果没有阻塞,调度程序将不会切换到其他 Goroutine。
在代码中,主 Goroutine 在 did 通道上启动并阻塞。调度程序必须切换到 other() Goroutine,该 Goroutine 在完成通道上发送一个值,使两个 Goroutine 都可以运行。调度程序选择继续执行other()。由于 GOMAXPROCS 为 1,主 Goroutine 仍处于阻塞状态。
other() 然后启动无限循环 Goroutine。该 Goroutine 继续运行,导致主 Goroutine 无法恢复。因此,Playground 会发生超时。
在本地,GOMAXPROCS 通常会超过 1。因此,当无限循环 Goroutine 运行时,另一个 Goroutine(可能是主 Goroutine)会同时执行。当主 Goroutine 返回时,程序终止,因为它不会等待其他非主 Goroutine 的完成。
Go Playground 修改
通过显式设置 GOMAXPROCS 为1 在 Go Playground 上,可以重现“进程花费太长时间”的行为。相反,将 GOMAXPROCS 设置为较高的值,例如 2,通常会导致不同的执行顺序并成功终止而不会超时。
以上是为什么在本地机器上运行相同的代码时 Go Playground 会超时?的详细内容。更多信息请关注PHP中文网其他相关文章!