亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 工作線程池 - 從作業內部排隊新作業

Golang 工作線程池 - 從作業內部排隊新作業

Go
繁花不似錦 2022-09-05 10:46:44
我正在嘗試同時從一組存儲桶中構建一棵樹,并且鑒于worker模式在go中似乎非常流行,我嘗試將其應用于我的問題?;旧?,我啟動了一定數量的工人,讓他們收聽共享的工作渠道。然后,第一個工作線程接收樹根節點作為第一個作業,并在分支和創建另外 2 個作業之前用相關信息填充它。然后,這些作業應該分布在其他工作者之間,然后這些工作線程將遞歸地生成更多的工作,直到整個樹被構造出來。我的幼稚方法的簡化表示類似于以下內容: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 個作業中添加 2 個新作業,因為在某些時候,每個工作線程都會忙于嘗試將作業發送到通道,并且沒有工作線程位于接收端。任何人都可以為我指出一個優雅的解決方案的方向,還是我對這個問題的整個方法都是錯誤的?
查看完整描述

1 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

如果沒有其他工作人員準備好處理作業,請使用當前工作人員:


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 語句替換為調用 。jobs <- job{}doJob(job{}, jobs)


使用緩沖通道讓工作線程保持忙碌:


jobs := make(chan job, N)

調整,直到找到一個工作人員大多忙的值。的一個好的起始值是 。此調整不是防止死鎖所必需的。當 N 等于零時,程序不會死鎖。NNcount


查看完整回答
反對 回復 2022-09-05
  • 1 回答
  • 0 關注
  • 81 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號