Реализуйте обработку заказов пулом из w воркеров (не более w
одновременно). Каждый заказ обрабатывается функцией process(id), которая
может вернуть ошибку.
// ProcessOrders обрабатывает orderIDs пулом из w воркеров (w одновременно).
// process(id) может вернуть error. При первой критической ошибке все воркеры
// немедленно прекращают работу, функция возвращает эту ошибку.
func ProcessOrders(orderIDs []int, w int, process func(id int) error) error
Требования:
- Не более
w одновременных вызовов process.
- При первой ошибке: все воркеры как можно скорее прекращают работу, а
функция возвращает именно эту ошибку.
- Если все заказы обработаны без ошибок — возвращается
nil.
- Реализовать вручную через
context + каналы (без golang.org/x/sync).
На что смотрит интервьюер:
- Ограничение параллелизма ровно
w (буферизованный канал-семафор или
фиксированное число горутин-воркеров, читающих из общего канала задач).
- Отмена через
context: первая ошибка отменяет контекст, воркеры
проверяют ctx.Done() и не берут новые задачи.
- Нет гонок под
-race, нет утечек горутин; возвращается корректная ошибка.