Back to questions
СБЕР
Middle
3
Как данные агрегируются после обработки воркерами?
Companies where asked
Answer from AI
sobes.tech AI
В Go при использовании воркеров (worker pool) для параллельной обработки данных часто возникает задача агрегировать результаты.
Основные способы агрегации данных после обработки воркерами:
-
Через каналы (channels)
- Каждый воркер отправляет результат в общий канал.
- Главная горутина читает из канала и агрегирует данные (например, суммирует, собирает в срез).
-
Использование sync.WaitGroup для ожидания завершения всех воркеров
- После завершения всех воркеров агрегирование может происходить в главной горутине.
-
Использование мьютексов (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.