我一直在研究 A Tour of Go 中的以下代码,但是当我应用一些小的更改时,我不明白发生了什么。原代码是这样的
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
它产生了这个
world
hello
hello
world
world
hello
hello
world
world
hello
没关系:五次你好,五次世界。当我打电话时我开始变得奇怪
say("world")
go say("hello")
现在输出只是
world
world
world
world
world
没有任何问候。有两个 goroutine 就更奇怪了
go say("world")
go say("hello")
现在根本没有输出。当我改变 i < 5
至 i < 2
并调用
go say("world")
say("hello")
我明白了
world
hello
hello
我在这里错过了什么?
最佳答案
如果是
say("world")
go say("hello")
“world”调用必须在“hello”goroutine 启动之前完成。 “你好”goroutine 没有运行或完成because main returns .
为了
go say("world")
go say("hello")
goroutines 没有运行或完成,因为 main 返回。
使用sync.WaitGroup防止 main 在 goroutines 完成之前退出:
func say(wg *sync.WaitGroup, s string) {
defer wg.Done()
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go say(&wg, "world")
go say(&wg, "hello")
wg.Wait()
}
关于go - 试图理解 goroutines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36677614/