Выбор ответа Middle Паттерны конкурентности спрашивают часто обновлено
Порядок результатов в worker pool
Вопрос
Воркеры обрабатывают задачи параллельно, а результат нужен в исходном порядке. Как проще всего?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Передавать индекс задачи и писать результат в res[i]. Каждая горутина пишет в свою ячейку слайса фиксированной длины, это не гонка (разные элементы), а после wg.Wait() слайс в исходном порядке.
Варианты ответа
- Передавать индекс задачи и писать результат в
res[i]правильный ответ - Сортировать горутины по времени запуска через runtime
- Использовать небуферизованный канал результатов: он сохраняет порядок
- Запускать воркеры с GOMAXPROCS=1, тогда порядок сохранится
Разбор
Каждая горутина пишет в свою ячейку слайса фиксированной длины, это не гонка (разные элементы), а после wg.Wait() слайс в исходном порядке. Канал сохраняет порядок отправок, но отправки разных воркеров перемешаны. GOMAXPROCS=1 не гарантирует порядок выполнения и убивает параллелизм. Сортировки горутин не существует.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.