是否可以根据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状态的方法吗?任何对此的指点将不胜感激。
答案 0 :(得分:4)
WaitGroup等待goroutine的集合完成。
因此,是的,为了等待goroutine的收集完成,我建议使用WaitGroup
。如文档所述,您为每个启动的工作人员调用Add
,并在每个工作人员完成时调用Done
。您的for len()
忙碌循环将替换为:
wg.Wait()
根据文档。