go程序中goroutine不执行主因是main提前退出,需用sync.waitgroup显式等待;cpu密集型任务并行慢可能因gomaxprocs=1或gc干扰;channel死锁常见于无缓冲chan发送无接收,应合理使用缓冲或worker pool限流。
goroutine 启动后不执行?检查是否主 goroutine 提前退出
Go 程序中启动 go func() 后没看到输出或结果,大概率是 main 函数返回、进程直接退出了。Go 不会自动等待子 goroutine 完成。
- 用
sync.WaitGroup显式等待:在启动前wg.Add(1),函数末尾wg.Done(),主 goroutine 调用wg.Wait() - 避免用
time.Sleep模拟等待——不可靠,容易误判完成时机 - 若任务有返回值,别把结果塞进全局变量再读取;优先用 channel 接收,或封装为带
return的闭包 +WaitGroup
多个 CPU 密集型任务并行跑不快?确认 GOMAXPROCS 设置与 runtime.GC 干扰
Go 默认将 GOMAXPROCS 设为系统逻辑 CPU 数,但若手动设为 1,所有 goroutine 就只能在一个 OS 线程上调度,无法真正并行执行计算任务。
- 启动时检查:
fmt.Println(runtime.GOMAXPROCS(0))—— 返回当前值;如为 1,加runtime.GOMAXPROCS(runtime.NumCPU()) - CPU 密集型任务中频繁触发 GC(比如分配大量中间切片)会显著拖慢吞吐;考虑复用
[]byte或使用sync.Pool - 避免在循环内无节制启动 goroutine(如百万级),应配合 worker pool 限流,否则调度器压力大、内存暴涨
用 channel 做并发结果收集,为什么出现 deadlock?
典型死锁场景:所有 goroutine 都在向一个未缓冲的 channel 发送,但没有 goroutine 在接收;或接收方在发送方全部启动前就退出了。