Sobes.tech
Back to questions
Middle
3

Как данные агрегируются после обработки воркерами?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

В Go при использовании воркеров (worker pool) для параллельной обработки данных часто возникает задача агрегировать результаты.

Основные способы агрегации данных после обработки воркерами:

  1. Через каналы (channels)

    • Каждый воркер отправляет результат в общий канал.
    • Главная горутина читает из канала и агрегирует данные (например, суммирует, собирает в срез).
  2. Использование sync.WaitGroup для ожидания завершения всех воркеров

    • После завершения всех воркеров агрегирование может происходить в главной горутине.
  3. Использование мьютексов (sync.Mutex) или атомарных операций

    • Если агрегируемый ресурс общий (например, счетчик), воркеры могут обновлять его с защитой от гонок.

Пример с каналами и WaitGroup:

var wg sync.WaitGroup
results := make(chan int, 10) // буферизированный канал

worker := func(id int, jobs <-chan int) {
    defer wg.Done()
    for job := range jobs {
        // обработка
        result := job * 2
        results <- result
    }
}

jobs := make(chan int, 10)

// Запуск воркеров
for w := 0; w < 3; w++ {
    wg.Add(1)
    go worker(w, jobs)
}

// Отправка заданий
for j := 1; j <= 5; j++ {
    jobs <- j
}
close(jobs)

// Закрываем канал результатов после завершения всех воркеров
go func() {
    wg.Wait()
    close(results)
}()

// Агрегация результатов
sum := 0
for r := range results {
    sum += r
}
fmt.Println("Sum of results:", sum)

Таким образом, данные агрегируются через канал, а синхронизация обеспечивается WaitGroup.