такую штуку
Есть канал. У канала 1 воркер, несколько отправителей
Есть воркер-горутина. Он слушает канал. Дабы не потреблять в for-select-case-default много ресурсов cpu, и не костылить со Sleep в дефолте, пока из канали не придёт сообщение, воркер ждёт. Читай — заблокирован в for-select-case
Есть много горутин-отправителей, у них есть ссылка на канал, горутины-отправители могут просыпаться в любой момент.
Вопрос прост — почему я не могу сделать так, чтобы у меня крутился forever воркер и хендлил сообщения в канале от sender’ов? Сплошные дедлоки…
А код можно? Или репродьюс. Желательно на play.golang.org
В эрланге проще. Там воркеры-gen_server по умолчанию заблокированы без сообщений и слушают “почтовый ящик”
Ща накатаю. Код был где-то.
Вообще если вы в форе слушаете канал, в селекте без дефолта или в явной форме (a := <- ch), то он будет заблокирован пока не появится данных
Ща, тогда просто попробую запустить слушалку (playground скину)
Да, это работает https://play.golang.org/p/Ot8lDcFh1mB
Ща буду воркеров добавлять, покажу.
А кто мешает просто заблокироваться на чтении из канала? Типа for { select { case task := <- tasks: // do tasks case <-ctx.Done() } }
https://tour.golang.org/welcome/1 https://gobyexample.com/
Дико извиняюсь. Не могу воспроизвести. Вчера мог воспроизвести, сейчас код с нуля написал (не сохранилось, как оказалось), и проблемы не возникло. worker висит, ждёт, отрабатывает сообщения жобы отправляют в канал сообщения WaitGroup нормально отрабатывает. 😅
Ещё советую for range, если канал один
Вот сейчас с ним ещё проверю.
Баг попався! https://play.golang.org/p/RoN1qVP86j9 Как я понял, проблема том, что for range {} ждёт сообшения из незакрытого канала, в который никто никогда не напишет. Но как закрыть канал, если отправителей много?
func readSeconds рудимент. Пардон муа … =(
Обсуждают сегодня