我做了一個小程序來對 go channel 吞吐量進(jìn)行基準(zhǔn)測試,但是它總是死鎖,我很努力地嘗試但不明白為什么:package mainimport ( "fmt" "runtime")const CONCURRENCY = 32const WORK_PER_WORKER = 100const TOTAL_WORK = CONCURRENCY * WORK_PER_WORKERfunc work() { sum := 0 for i := 0; i < 10000000; i++ { sum *= i }}type WorkItem struct { Done chan int}func main() { runtime.GOMAXPROCS(CONCURRENCY) var workQueue [CONCURRENCY]chan *WorkItem // initialize workers for i := 0; i < CONCURRENCY; i++ { workQueue[i] = make(chan *WorkItem) } // start workers for i := 0; i < CONCURRENCY; i++ { go func(i int) { anItem := <-workQueue[i] work() anItem.Done <- 1 }(i) } completed := make(chan bool, TOTAL_WORK) for i := 0; i < TOTAL_WORK; i++ { go func(i int) { // send work to queues workToDo := &WorkItem{Done: make(chan int)} workQueue[i/WORK_PER_WORKER] <- workToDo // !! DEADLOCK // wait until the work is done <-workToDo.Done completed <- true }(i) } fmt.Println("Waiting") for i := 0; i < TOTAL_WORK; i++ { <-completed }}
2 回答

隔江千里
TA貢獻(xiàn)1906條經(jīng)驗 獲得超10個贊
因為你的工人只處理一項任務(wù)然后退出。因此,只有第一個CONCURRENCY項目繼續(xù)進(jìn)行,然后workQueue[i/WORK_PER_WORKER] <- workToDo無限地阻塞。因此,completedchan 永遠(yuǎn)不會收到足夠的值并且main永遠(yuǎn)阻塞。
您的工作人員應(yīng)該在循環(huán)中工作,如下所示:
for i := 0; i < CONCURRENCY; i++ {
go func(i int) {
for anItem := range workQueue[i] {
work()
anItem.Done <- 1
}
}(i)
}
- 2 回答
- 0 關(guān)注
- 279 瀏覽
添加回答
舉報
0/150
提交
取消