【发布时间】:2014-01-06 19:04:33
【问题描述】:
我有一个经典的“生产者-消费者”问题的变体。在我的程序中,有 10 个生产者并行工作,他们的目标是总共生产 N 个产品。
我考虑过使用缓冲通道:
products := make([]int, 100) // In total, produce 100 products
// The producers
for i := 0; i < 10; i++ {
go func() {
products <- 1 // !!
}()
}
但是,它不起作用:
- goroutine 没有意识到目标已经达到,channel 发送块,函数永远不会返回。
-
if len(products) < 100 { products <- 1 }不是原子操作,因此没有帮助。
那么还有其他方法吗?
【问题讨论】:
-
我可以礼貌地建议您的术语在这里有点误导。生产者-消费者模式通常是指一个生产者和多个消费者,也称为观察者模式。你没有在这个意义上使用它。相反,您描述的是一种任务耕作模式,其中许多工人为单个控制器产生工作结果。
-
@Rick-777 谢谢,你是对的。
标签: go