我正在嘗試同時從一組存儲桶中構建一棵樹,并且鑒于worker模式在go中似乎非常流行,我嘗試將其應用于我的問題?;旧希覇恿艘欢〝?shù)量的工人,讓他們收聽共享的工作渠道。然后,第一個工作線程接收樹根節(jié)點作為第一個作業(yè),并在分支和創(chuàng)建另外 2 個作業(yè)之前用相關信息填充它。然后,這些作業(yè)應該分布在其他工作者之間,然后這些工作線程將遞歸地生成更多的工作,直到整個樹被構造出來。我的幼稚方法的簡化表示類似于以下內(nèi)容:func workers(count int) { wg := sync.WaitGroup{} wg.Add(count) jobs := make(chan job) for i := 0; i < count; i++ { go func() { // worker waits for job and then executes it for j := range jobs { processJob(j, jobs) } wg.Done() }() } // start with some initial job jobs <- job{} wg.Wait()}func processJob(j job, jobs chan job) { // jobs channel is closed when tree is finished if done { close(jobs) } // Do some more irrelevant stuff // sometimes 2 new jobs result from this one jobs <- job{} jobs <- job{} // but that doesn't work, if all workers try to send and no one receives}問題是,我無法從 1 個作業(yè)中添加 2 個新作業(yè),因為在某些時候,每個工作線程都會忙于嘗試將作業(yè)發(fā)送到通道,并且沒有工作線程位于接收端。任何人都可以為我指出一個優(yōu)雅的解決方案的方向,還是我對這個問題的整個方法都是錯誤的?
1 回答

莫回無
TA貢獻1865條經(jīng)驗 獲得超7個贊
如果沒有其他工作人員準備好處理作業(yè),請使用當前工作人員:
func doJob(j job, jobs chan job) {
select {
case jobs <- j:
default:
// Send to jobs was not ready, do the job
// in the current worker.
processJob(j, jobs)
}
}
將 send 語句替換為調(diào)用 。jobs <- job{}doJob(job{}, jobs)
使用緩沖通道讓工作線程保持忙碌:
jobs := make(chan job, N)
調(diào)整,直到找到一個工作人員大多忙的值。的一個好的起始值是 。此調(diào)整不是防止死鎖所必需的。當 N 等于零時,程序不會死鎖。NNcount
- 1 回答
- 0 關注
- 92 瀏覽
添加回答
舉報
0/150
提交
取消