Gorountines 导致死锁
Gorountines causing a deadlock
我正在尝试 goroutines 并想出了这个例子 - https://go.dev/play/p/mWHUmALk-1_K
但是我遇到了这个错误 - fatal error: all goroutines are asleep - deadlock!
我试图解决这个问题,但没有成功。请问我该如何解决?
错误似乎在第 15、23 和 32 行。
问题是您的程序启动了 3 个单独的 goroutine,这些 goroutine 发送到同一个频道。而且您只有主 goroutine 从该频道接收一次。这会导致第二个通道发送 (ch <- fmt.Sprintf("...
) 无限期阻塞。使用无缓冲通道,您需要接收和发送一样多的数据。
确保接收到所有发送的一种方法是在通道上使用 range
循环。
func getLength(dd []string, wg *sync.WaitGroup) {
wg.Add(len(dd))
c := make(chan string)
for _, d := range dd {
d1 := d
go computeLength(d1, c, wg)
}
// close c once all goroutines are done to
// ensure the for-range loop below exits.
go func() { wg.Wait(); close(c) }()
// Use for-range loop on the channel to receive all the sends.
//
// But note that a for-range loop over a channel exits only
// when the channel is closed or the loop is exited from within.
//
// So to exit you can close c once wg.Wait() returns,
// that's why there's that extra goroutine above.
for v := range c {
fmt.Println(v)
}
}
我正在尝试 goroutines 并想出了这个例子 - https://go.dev/play/p/mWHUmALk-1_K
但是我遇到了这个错误 - fatal error: all goroutines are asleep - deadlock!
我试图解决这个问题,但没有成功。请问我该如何解决?
错误似乎在第 15、23 和 32 行。
问题是您的程序启动了 3 个单独的 goroutine,这些 goroutine 发送到同一个频道。而且您只有主 goroutine 从该频道接收一次。这会导致第二个通道发送 (ch <- fmt.Sprintf("...
) 无限期阻塞。使用无缓冲通道,您需要接收和发送一样多的数据。
确保接收到所有发送的一种方法是在通道上使用 range
循环。
func getLength(dd []string, wg *sync.WaitGroup) {
wg.Add(len(dd))
c := make(chan string)
for _, d := range dd {
d1 := d
go computeLength(d1, c, wg)
}
// close c once all goroutines are done to
// ensure the for-range loop below exits.
go func() { wg.Wait(); close(c) }()
// Use for-range loop on the channel to receive all the sends.
//
// But note that a for-range loop over a channel exits only
// when the channel is closed or the loop is exited from within.
//
// So to exit you can close c once wg.Wait() returns,
// that's why there's that extra goroutine above.
for v := range c {
fmt.Println(v)
}
}