You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:40:30