【发布时间】:2017-03-17 06:03:01
【问题描述】:
我正在尝试在 go 中实现一个简单的工作池并不断遇到问题。我想做的就是让一定数量的工人在做更多工作之前完成一定数量的工作。我使用的代码类似于:
jobs := make(chan imageMessage, 1)
results := make(chan imageMessage, 1)
for w := 0; w < 2; w++ {
go worker(jobs, results)
}
for j := 0; j < len(images); j++ {
jobs <- imageMessage{path: paths[j], img: images[j]}
}
close(jobs)
for r := 0; r < len(images); r++ {
<-results
}
}
func worker(jobs <-chan imageMessage, results chan<- imageMessage) {
for j := range jobs {
processImage(j.path, j.img)
results <- j
}
}
我的理解是,这应该会创建 2 名工人,他们一次可以做 1 件“事情”,并且在他们完成那件事情时会继续获得更多的工作,直到没有其他事情可做。但是,我得到fatal error: all goroutines are asleep - deadlock!
如果我将缓冲区设置为 100 之类的巨大值,这可行,但我希望能够限制一次完成的工作。
我觉得我很接近,但显然错过了什么。
【问题讨论】:
标签: multithreading go concurrency channel goroutine