2 回答

TA貢獻1744條經驗 獲得超4個贊
因為它停在這里:
workerAddr?:=?<-registerChan
對于緩沖通道:
要使其workerAddr := <-registerChan
正常工作:通道registerChan
?必須有一個值;否則,代碼將在此停止等待通道。
我設法以這種方式運行你的代碼(試試這個):
package main
import (
? ? "fmt"
? ? "sync"
)
func main() {
? ? registerChan := make(chan int, 1)
? ? for i := 1; i <= 10; i++ {
? ? ? ? wg.Add(1)
? ? ? ? go fn(i, registerChan)
? ? }
? ? registerChan <- 0 // seed
? ? wg.Wait()
? ? fmt.Println(<-registerChan)
}
func fn(taskArgs int, registerChan chan int) {
? ? workerAddr := <-registerChan
? ? workerAddr += taskArgs
? ? registerChan <- workerAddr
? ? wg.Done()
}
var wg sync.WaitGroup
輸出:
55
說明:
此代碼使用通道和 10 個 goroutine 加上一個主 goroutine 將 1 與 10 相加。
我希望這有幫助。

TA貢獻1797條經驗 獲得超6個贊
當您運行此語句時registerChan <- workerAddr
,如果通道容量已滿,則無法添加它,并且它將阻塞。如果你有一個池,比如 10 個workerAddr,你可以在調用之前將它們全部添加到容量為 10 的緩沖通道中schedule
。不要在調用后添加,以保證如果您從通道中獲取值,之后有空間再次添加它。defer
在 goroutine 的開頭使用是很好的。
- 2 回答
- 0 關注
- 178 瀏覽
添加回答
舉報