Можно ли сделать длину канала для задач равной 10?
Что проверяют
Понимаете ли вы, что буфер у канала это не ускорение, а способ пережить всплеск, и различаете ли ёмкость и длину. Часто вопрос идёт следом за вашим же кодом: интервьюер хочет услышать, откуда взялось конкретное число.
Как отвечать
Да, make(chan Task, 10) создаёт канал с буфером на десять элементов. Терминология тут важна: 10 это cap, ёмкость, а len показывает, сколько значений лежит в буфере прямо сейчас. Поменять ёмкость после создания нельзя, буфер выделяется один раз.
Дальше отвечайте по смыслу, а не по синтаксису. Буфер не повышает пропускную способность: если потребитель в среднем медленнее производителя, любой конечный буфер заполнится, и отправка снова начнёт блокироваться. Буфер лишь сглаживает неравномерность и разводит участников по времени. Блокировка на полном буфере это не баг, а обратное давление, оно не даёт очереди съесть всю память.
Откуда брать число:
- по количеству воркеров или по размеру пачки, если канал кормит пул;
- нулевая ёмкость, когда важно убедиться, что задачу действительно забрали;
- небольшой буфер плюс
selectсdefault, если переполнение лучше отбросить, чем ждать.
Где спотыкаются
Первое: рассуждают в духе «поставим буфер побольше, чтобы не блокировалось». Большой буфер прячет перекос и превращает его в рост памяти и задержки: задача лежит в очереди минуты, а метрики отправителя показывают, что всё быстро.
Второе: отправляют в буферизованный канал из той же горутины и удивляются сообщению про спящие горутины. Одиннадцатая отправка в канал на десять без читателя останавливает единственную горутину, и рантайм завершает программу.
Третье: забывают про завершение. Закрывает канал отправитель, запись в закрытый канал это паника, а при остановке сервиса всё, что осталось в буфере, пропадёт: это память процесса, а не очередь с гарантией доставки.