为何这段Golang代码无法输出20条问候语?
问题分析
你的代码里,两个SayGreetings goroutine还没跑完10次循环,主goroutine就因为time.Sleep(2 * time.Second)到期而退出了——Go程序只要主goroutine结束,所有其他goroutine都会被强制终止,不管它们有没有执行完任务。
看SayGreetings里的休眠逻辑:每次最多休眠2.5秒,就算每次都睡0秒,10次循环也要输出10条,但主goroutine只等2秒,大概率两个goroutine都没跑完10次,自然出不来20条问候语。
解决方案
用sync.WaitGroup来等待所有子goroutine执行完毕,这是Go里等待并发任务完成的标准做法:
package main import ( "log" "math/rand" "sync" "time" ) func SayGreetings(greeting string, times int, wg *sync.WaitGroup) { // 任务完成后调用Done,通知WaitGroup计数器减一 defer wg.Done() for i := 0; i < times; i++ { log.Println(greeting) d := time.Second * time.Duration(rand.Intn(5)) / 2 time.Sleep(d) } } func main() { rand.Seed(time.Now().UnixNano()) log.SetFlags(0) var wg sync.WaitGroup // 要等待2个goroutine,所以计数器设为2 wg.Add(2) go SayGreetings("hi!", 10, &wg) go SayGreetings("hello!", 10, &wg) // 阻塞主goroutine,直到所有子goroutine都调用Done,计数器归0 wg.Wait() }
如果你只是临时测试,也可以把主goroutine的休眠时间延长到足够长(比如15秒),但这种方法不严谨——你没法准确预估所有任务的执行时间,用WaitGroup才是可靠的方案。
内容的提问来源于stack exchange,提问作者user18625843
相关产品推荐
相关产品推荐

