Реализуйте конвейер, который обрабатывает входные элементы параллельно в
workers горутинах, но выдаёт результаты в выходной канал строго в порядке
поступления (0, 1, 2, ...), независимо от того, какой воркер закончил
раньше.
// ProcessOrdered обрабатывает вход in параллельно в workers горутинах, но
// пишет результаты в out СТРОГО в порядке поступления (0,1,2,...), независимо
// от того, какой воркер закончил раньше. Канал out закрывается по завершении.
func ProcessOrdered(in <-chan int, workers int, work func(int) int) <-chan int
Требования:
- Параллельная обработка в
workers горутинах (ускорение на медленных
work).
- Порядок результатов в
out строго соответствует порядку входных элементов.
- Канал
out закрывается после обработки всех элементов входа.
- Без гонок под
-race, без утечек горутин.
Подсказка: классический паттерн «канал каналов» (future): для каждого входа
создаётся канал-результат, помещаемый в упорядоченную очередь; диспетчер
раздаёт работу воркерам, а коллектор читает каналы-результаты по порядку и
пересылает значения в out.
На что смотрит интервьюер:
- Понимание паттерна сохранения порядка при параллельной обработке
(chan-of-chans / future или reorder-буфер по индексу).
- Реальный параллелизм — результаты собираются по мере готовности, но
выдаются по порядку.
- Корректное закрытие
out ровно один раз, отсутствие дедлоков.
- Чистота под
-race, отсутствие утечек горутин.