我遇到以下代碼 fatal error: all goroutines are asleep - deadlock!
我正確使用緩沖通道嗎?如果您能給我指點,我將不勝感激。不幸的是,我已經無計可施了。
func main() {
valueChannel := make(chan int, 2)
defer close(valueChannel)
var wg sync.WaitGroup
for i := 0; i < 10; i {
wg.Add(1)
go doNothing(&wg, valueChannel)
}
for {
v, ok := <- valueChannel
if !ok {
break
}
fmt.Println(v)
}
wg.Wait()
}
func doNothing(wg *sync.WaitGroup, numChan chan int) {
defer wg.Done()
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
numChan <- 12
}
uj5u.com熱心網友回復:
主 goroutine<- valueChannel 在接收到所有值后阻塞 。關閉通道以解除主 goroutine 的阻塞。
func main() {
valueChannel := make(chan int, 2)
var wg sync.WaitGroup
for i := 0; i < 10; i {
wg.Add(1)
go doNothing(&wg, valueChannel)
}
// Close channel after goroutines complete.
go func() {
wg.Wait()
close(valueChannel)
}()
// Receive values until channel is closed.
// The for / range loop here does the same
// thing as the for loop in the question.
for v := range valueChannel {
fmt.Println(v)
}
}
在操場上運行示例。
上面的代碼獨立于 goroutine 發送的值的數量。如果該main()函式可以確定 goroutine 發送的值的數量,則從main()以下位置接收該數量的值:
func main() {
const n = 10
valueChannel := make(chan int, 2)
for i := 0; i < n; i {
go doNothing(valueChannel)
}
// Each call to doNothing sends one value. Receive
// one value for each call to doNothing.
for i := 0; i < n; i {
fmt.Println(<-valueChannel)
}
}
func doNothing(numChan chan int) {
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
numChan <- 12
}
在操場上運行示例。
uj5u.com熱心網友回復:
主要問題在于通道接收的 for 回圈。逗號 ok 習慣用法在通道上略有不同,ok 表示接收到的值是在通道上發送的 (true) 還是因為通道關閉且為空而回傳的零值 (false)。在這種情況下,通道正在等待發送資料,并且因為它已經完成了十次發送值:死鎖。因此,除了代碼設計之外,如果我只需要在這里進行盡可能少的更改,它是:
func main() {
valueChannel := make(chan int, 2)
defer close(valueChannel)
var wg sync.WaitGroup
for i := 0; i < 10; i {
wg.Add(1)
go doNothing(&wg, valueChannel)
}
for i := 0; i < 10; i {
v := <- valueChannel
fmt.Println(v)
}
wg.Wait()
}
func doNothing(wg *sync.WaitGroup, numChan chan int) {
defer wg.Done()
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
numChan <- 12
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358303.html
