Фиксированное число горутин читает задания из общего канала. Результаты можно сохранять по индексам и вернуть после WaitGroup.
Пул воркеров для параллельной обработки задач
Фиксированное число горутин читает задания из общего канала. Результаты можно сохранять по индексам и вернуть после WaitGroup.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется создать пул воркеров, который будет распределять поступающие задания между несколькими рабочими потоками, выполнять их одновременно и после завершения собрать полученные результаты.
Ответ
Фиксированное число горутин читает задания из общего канала. Результаты можно сохранять по индексам и вернуть после WaitGroup.
Минимальный пул для независимых задач над числами:
import "sync"
func Process(values []int, workers int, work func(int) int) []int {
if workers < 1 { panic("workers must be positive") }
jobs := make(chan int)
result := make([]int, len(values))
var wg sync.WaitGroup
for i := 0; i < workers; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for index := range jobs {
result[index] = work(values[index])
}
}()
}
for index := range values { jobs <- index }
close(jobs)
wg.Wait()
return result
}
Порядок результатов соответствует входу; каждый индекс записывает один работник, поэтому mutex для среза не нужен. work должна допускать конкурентные вызовы и завершаться. Для ошибок, отмены и зависающих внешних операций её контракт расширяют error и context.