Выбор ответа Middle Паттерны конкурентности спрашивают часто обновлено

Порядок результатов в worker pool

Вопрос

Воркеры обрабатывают задачи параллельно, а результат нужен в исходном порядке. Как проще всего?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Передавать индекс задачи и писать результат в res[i]. Каждая горутина пишет в свою ячейку слайса фиксированной длины, это не гонка (разные элементы), а после wg.Wait() слайс в исходном порядке.

Варианты ответа

  1. Передавать индекс задачи и писать результат в res[i]правильный ответ
  2. Сортировать горутины по времени запуска через runtime
  3. Использовать небуферизованный канал результатов: он сохраняет порядок
  4. Запускать воркеры с GOMAXPROCS=1, тогда порядок сохранится

Разбор

Каждая горутина пишет в свою ячейку слайса фиксированной длины, это не гонка (разные элементы), а после wg.Wait() слайс в исходном порядке. Канал сохраняет порядок отправок, но отправки разных воркеров перемешаны. GOMAXPROCS=1 не гарантирует порядок выполнения и убивает параллелизм. Сортировки горутин не существует.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.