死锁不在跨通道范围循环中。如果在操场上运行代码,则会在堆栈跟踪的顶部看到该错误是由引起的
wg2.Wait(操场上的第88行并由堆栈跟踪指向)。同样在stacktrace中,您可以看到由于死锁而尚未完成的所有goroutine,这是因为它
oneResult<-t从未完成,因此循环中启动的所有goroutine都不会完成。
所以主要问题在这里:
wg2.Wait()close(oneResult)// ...for n := range oneResult{// ...我想,也不希望在封闭的通道上循环。但是,即使您没有关闭通道,该循环也将永远不会开始,因为
wg2.Wait()它将等待直到 完成 。
oneResult <- twg2.Done()
但是永远不会做,因为它依赖于已经在运行的循环。
oneResult <-t除非另一侧有人从该通道接收信号,这是您的循环,否则该行将不会完成,但是,通道范围循环仍在等待
wg2.Wait()完成。
因此,实质上,您在通道的发送方和接收方之间具有“循环依赖”。
要解决此问题,您需要允许循环从通道开始接收,同时仍要确保完成后通道已关闭。您可以通过将两条等待和关闭行包装到它们自己的goroutine中来进行操作。
https://play.golang.com/p/rwwCFVszZ6Q



