1 回答

TA貢獻(xiàn)1884條經(jīng)驗 獲得超4個贊
您的代碼中有很多問題。
在關(guān)閉的頻道上發(fā)送
使用 Go 通道的一個一般原則是
不要從接收端關(guān)閉通道,如果通道有多個并發(fā)發(fā)送者則不要關(guān)閉通道
您的解決方案很簡單:不要有多個并發(fā)發(fā)件人,然后您可以從發(fā)件人端關(guān)閉頻道。
與其為添加到通道的每個作業(yè)啟動數(shù)百萬個單獨的 goroutine,不如運行一個執(zhí)行整個循環(huán)的 goroutine 以將所有作業(yè)添加到通道。并在循環(huán)后關(guān)閉通道。工作人員將盡可能快地使用通道。
通過修改多個 goroutine 中的共享變量來進(jìn)行數(shù)據(jù)競爭
您在不采取特殊步驟的情況下修改兩個共享變量:
nResults
,您將其傳遞給countWrites *int64
工作人員中的。i
jobs
在寫入作業(yè)通道的循環(huán)中:您從多個 goroutines 向它添加 99,這使得它無法預(yù)測您實際向通道寫入了多少值
要解決 1,有很多選項,包括使用sync.Mutex
.?但是,由于您只是添加它,所以最簡單的解決方案是使用atomic.AddInt64(countWrites, 1)
而不是*countWrites += 1
要解決 2,不要在每次寫入通道時使用一個 goroutine,而是在整個循環(huán)中使用一個 goroutine(見上文)
- 1 回答
- 0 關(guān)注
- 96 瀏覽
添加回答
舉報