У меня есть вариация классической проблемы «производитель-потребитель». В моей программе есть 10 производителей, работающих параллельно, и их целью является производство N продуктов в целом.Как «попробовать отправить» на канал и прервать, если канал заполнен?
Я думал об использовании буферизованного канала:
products := make([]int, 100) // In total, produce 100 products
// The producers
for i := 0; i < 10; i++ {
go func() {
products <- 1 // !!
}()
}
Однако, это не будет работать:
- goroutine не понимает, что цель достигнута, канал отправки блоков, и функция никогда возвращается.
if len(products) < 100 { products <- 1 }
не является атомной операцией, поэтому это не помогает.
Есть ли другой подход?
Могу ли я вежливо предположить, что ваша терминология здесь немного вводит в заблуждение. Модель производителя-потребителя часто относится к одному производителю и многим потребителям, иначе известному как шаблон наблюдателя. Вы не используете его в этом смысле. Вместо этого вы описываете шаблон фермы задач, при этом многие рабочие производят результаты работы для одного контроллера. –
@ Rick-777 Спасибо, ты прав. –