Windows下Goroutine无法像Linux下正常执行完毕的问题求助
Go语言Windows环境下Goroutine未执行完毕的原因与解决办法
问题原因
你代码里用time.Sleep协调主goroutine和子goroutine的执行节奏,但Windows系统的定时器精度远低于Linux。默认情况下,Windows的系统定时器分辨率约为10-15毫秒,你代码中设定的time.Millisecond * 1会被系统向上取整到最小可用的定时器间隔。
这直接打乱了子goroutine的循环节奏:原本预期每次循环仅睡眠1毫秒,但实际会睡眠10毫秒以上,而主goroutine两次Sleep加起来才7毫秒。主goroutine执行完毕退出后,整个进程会直接终止,还在执行的子goroutine会被强制中断,所以你看不到后续的2、3、4输出。
而Linux的定时器精度更高,能更接近你设定的1毫秒间隔,子goroutine可以在主goroutine退出前完成所有循环。
解决办法
不要依赖time.Sleep这种不可靠的同步方式,改用Go标准库提供的sync.WaitGroup来等待子goroutine执行完毕,这是goroutine同步的标准做法。
修改后的代码如下:
import ( "fmt" "sync" "time" ) func count(wg *sync.WaitGroup) { // 函数执行完毕时通知WaitGroup任务完成 defer wg.Done() for i := 0; i < 5; i++ { fmt.Println(i) time.Sleep(time.Millisecond * 1) } } func main() { var wg sync.WaitGroup // 标记有1个goroutine需要等待 wg.Add(1) go count(&wg) time.Sleep(time.Millisecond * 2) fmt.Println("Hello World") // 阻塞直到所有标记的goroutine完成 wg.Wait() }
代码说明
sync.WaitGroup用于追踪需要等待的goroutine数量:wg.Add(1)表示要等待1个goroutine;- 子goroutine中用
defer wg.Done(),确保函数无论正常结束还是异常退出,都会通知WaitGroup任务完成; - 主goroutine最后调用
wg.Wait(),会阻塞直到所有被追踪的goroutine执行完毕,彻底避免子goroutine被强制中断的情况。
无论在Windows还是Linux环境下,这段代码都会输出一致的结果:
0 1 Hello World 2 3 4
内容的提问来源于stack exchange,提问作者DagaReiN
相关产品推荐
相关产品推荐

