确定所有工人都已完成

时间:2018-08-20 16:41:31

标签: go threadpool

是否可以根据Marcio's thread pool implementation确定何时完成所有工作?

等待JobQueue为空很简单:

// Wait for the job queue to clear
for len(JobQueue) > 0 {
    // Just wait
}

但是在那之后,仍然可能会有goroutines在等待工人,或者工人还没有完成所有任务:

func (d *Dispatcher) dispatch() {
    for {
        select {
        case job := <-JobQueue:
            // a job request has been received
            go func(job Job) {
                // try to obtain a worker job channel that is available.
                // this will block until a worker is idle
                jobChannel := <-d.WorkerPool

                // dispatch the job to the worker job channel
                jobChannel <- job
            }(job)
        }
    }
}

最好的方法是什么?将WaitGroup添加到调度程序中,以及查询WaitGroup状态的方法吗?任何对此的指点将不胜感激。

1 个答案:

答案 0 :(得分:4)

the documentation

  

WaitGroup等待goroutine的集合完成。

因此,是的,为了等待goroutine的收集完成,我建议使用WaitGroup。如文档所述,您为每个启动的工作人员调用Add,并在每个工作人员完成时调用Done。您的for len()忙碌循环将替换为:

wg.Wait()

根据文档。