2 回答

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
你的代碼:
創(chuàng)建一個(gè)無(wú)緩沖的通道
trueChan
。創(chuàng)建 10 個(gè) goroutine,每個(gè) goroutine 都將嘗試寫入
trueChan
,這將阻塞直到有東西從中讀取。關(guān)閉
trueChan
,然后返回main()
main()
打印0
,因?yàn)樗€沒(méi)有從 goroutine 中讀取任何內(nèi)容同時(shí),由于
trueChan
在步驟 3 中關(guān)閉,在 goroutine 完成使用它之前,第一個(gè)嘗試寫入通道的 goroutine 出現(xiàn)恐慌
至少,在trueChan
您知道所有 goroutine 都已完成之前,您不應(yīng)該關(guān)閉它。實(shí)際上,您甚至在他們開(kāi)始使用它之前就將其關(guān)閉。
Async.WaitGroup
可能是做到這一點(diǎn)的一種方法,但在你的代碼中如何做到這一點(diǎn)并不明顯,因?yàn)槲也煌耆_定你的目標(biāo)。這段代碼看起來(lái)像一個(gè)簡(jiǎn)單的練習(xí),而不是一個(gè)真實(shí)的例子。如果你能解釋你的目標(biāo),我可能會(huì)提供更具體的建議。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的第一個(gè)和第二個(gè)問(wèn)題在同一個(gè)根源:
您在主程序中關(guān)閉通道,程序關(guān)閉通道,在您的例程將數(shù)據(jù)發(fā)送到通道之前退出程序您
通常必須在使用該程序的延遲中關(guān)閉通道香奈兒。例如,對(duì)于 yout 代碼的修復(fù):
package main
import (
"fmt"
)
func execute(trueChan chan<- bool, lowerRange int32, upperRange int32) {
go func() {
defer func(){
close (trueChan)
}()
for lowerRange <= upperRange {
fmt.Printf("\n handling number %v", lowerRange)
if lowerRange%2 == 0 {
trueChan <- true
}
lowerRange++
}
}()
}
func main() {
counter := 0
trueChan := make(chan bool)
execute(trueChan, 5, 25)
for _ = range trueChan{ // For small improvement here. Ref as below
counter++
}
fmt.Printf("\n%v", counter)
}
https://tour.golang.org/concurrency/4
- 2 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)