Golang Go语言中请教一个循环创建 goroutine 的输出卡住问题

发布于 1周前 作者 ionicwang 来自 Go语言

Golang Go语言中请教一个循环创建 goroutine 的输出卡住问题

示例代码

func main() {
	res := make(chan int, 3)
	for i := 0; i < 3; i++ {
		go func(num int) {
			res <- num
		}(i)
	}

	for v := range res {
		fmt.Println(v)
	}
	defer close(res)
	fmt.Println("main end")
}

示例代码会输出

0
1
2
fatal error: all goroutines are asleep - deadlock!  //线程睡死了。。

//希望得到输出

0
1
2
main end  //主线程输出

这个问题怎么解决,刚学习 channel goroutines 组合使用


更多关于Golang Go语言中请教一个循环创建 goroutine 的输出卡住问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

deadlock 的原因是

golang<br>for v := range res {<br> fmt.Println(v)<br>}<br>

这里在一直消费 res,消费了三次之后消费完了就一直等待了,程序卡死在这。

更多关于Golang Go语言中请教一个循环创建 goroutine 的输出卡住问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


怎么能判断消费完了,退出呢?

#2 是否消费完,得看生产那边什么时候 close 。消费这边也可以加一个超时,多长时间没来新得就不等了

在Go语言中,循环创建goroutine时遇到输出卡住的问题,通常与goroutine的执行顺序、同步机制以及资源竞争有关。以下是一些可能的解决方法和检查点:

  1. 确保使用同步机制:如果多个goroutine访问共享资源(如打印到同一个文件或终端),可能会导致输出混乱或卡住。使用sync.Mutexsync.WaitGroup来确保资源访问的同步。

  2. 检查死锁:确保没有因不当的锁使用导致死锁。每个MutexLock必须对应一个Unlock

  3. 避免资源竞争:使用race检测器(go run -race your_program.go)来检查代码中是否存在数据竞争。

  4. 限制并发数:如果goroutine数量过多,可能导致系统资源耗尽。使用带缓冲的channel或信号量(semaphore)来限制并发goroutine的数量。

  5. 检查goroutine的退出条件:确保每个goroutine都有明确的退出条件,避免无限循环。

  6. 使用合适的日志库:对于复杂的并发程序,使用如logruszap等日志库,它们通常对并发日志记录有更好的支持。

  7. 检查主goroutine的等待:确保主goroutine在所有子goroutine完成前不会退出,可以使用sync.WaitGroupWait方法来实现。

通过上述步骤,你应该能够定位并解决循环创建goroutine时遇到的输出卡住问题。如果问题依旧存在,建议详细检查代码逻辑或寻求更具体的帮助。

回到顶部