我正在嘗試同時(shí)從一組存儲(chǔ)桶中構(gòu)建一棵樹(shù),并且鑒于worker模式在go中似乎非常流行,我嘗試將其應(yīng)用于我的問(wèn)題?;旧?,我啟動(dòng)了一定數(shù)量的工人,讓他們收聽(tīng)共享的工作渠道。然后,第一個(gè)工作線程接收樹(shù)根節(jié)點(diǎn)作為第一個(gè)作業(yè),并在分支和創(chuàng)建另外 2 個(gè)作業(yè)之前用相關(guān)信息填充它。然后,這些作業(yè)應(yīng)該分布在其他工作者之間,然后這些工作線程將遞歸地生成更多的工作,直到整個(gè)樹(shù)被構(gòu)造出來(lái)。我的幼稚方法的簡(jiǎn)化表示類似于以下內(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}問(wèn)題是,我無(wú)法從 1 個(gè)作業(yè)中添加 2 個(gè)新作業(yè),因?yàn)樵谀承r(shí)候,每個(gè)工作線程都會(huì)忙于嘗試將作業(yè)發(fā)送到通道,并且沒(méi)有工作線程位于接收端。任何人都可以為我指出一個(gè)優(yōu)雅的解決方案的方向,還是我對(duì)這個(gè)問(wèn)題的整個(gè)方法都是錯(cuò)誤的?
1 回答

莫回?zé)o
TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果沒(méi)有其他工作人員準(zhǔn)備好處理作業(yè),請(qǐng)使用當(dāng)前工作人員:
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 語(yǔ)句替換為調(diào)用 。jobs <- job{}doJob(job{}, jobs)
使用緩沖通道讓工作線程保持忙碌:
jobs := make(chan job, N)
調(diào)整,直到找到一個(gè)工作人員大多忙的值。的一個(gè)好的起始值是 。此調(diào)整不是防止死鎖所必需的。當(dāng) N 等于零時(shí),程序不會(huì)死鎖。NNcount
- 1 回答
- 0 關(guān)注
- 79 瀏覽
添加回答
舉報(bào)
0/150
提交
取消