Пул воркеров для параллельной обработки задач

Фиксированное число горутин читает задания из общего канала. Результаты можно сохранять по индексам и вернуть после 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее