Четыре задачи блока — четыре ситуации, которые встречаются в любом сервисе. Горутина
отдаёт результат, а получатель уже ушёл по таймауту. Генератор должен остановиться сам,
если его никто не читает. Срочные сообщения нужно обрабатывать раньше обычных.
Несколько сигналов отмены нужно свести в один.
Все четыре решаются каналами и select, и во всех главная ошибка одна: горутина,
которая осталась ждать навсегда. Поэтому в каждой задаче, кроме «работает ли», задавайте
себе вопрос «кто и когда остановит каждую запущенную горутину».
03 · Generator с таймаутом бездействия — генератор
закрывает канал сам, если из него 500 мс никто не читает. Таймер сбрасывается только
после успешной отправки.
04 · Очередь с приоритетом на select — сначала
неблокирующая попытка прочитать high, потом ожидание обоих каналов; выход, когда
закрыты оба. Это предпочтение, а не строгий приоритет: при постоянно готовом high
канал low может голодать.
01 · Or-Channel — один канал, который закрывается, когда
сработал любой из N входных. Понадобится рекурсия и способ завершить все
вспомогательные горутины.
// Идиома блока: отправить или сдаться по сигналу отмены, но не висеть.select {case out <- v: // получатель забрал значениеcase <-done: // нас отменили: выходим return}