Назад к вопросам
X5 group
Middle+
7
Как распараллелить обработку логов с использованием worker pool? Как получать результаты из горутин?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для распараллеливания обработки логов с worker pool в Go создают пул горутин-воркеров, которые получают задачи из канала. Основная горутина отправляет логи в канал задач, а воркеры читают их, обрабатывают и отправляют результаты в другой канал.
Пример:
package main
import (
"fmt"
"sync"
)
func worker(id int, jobs <-chan string, results chan<- string, wg *sync.WaitGroup) {
defer wg.Done()
for log := range jobs {
// Обработка лога
result := fmt.Sprintf("worker %d processed: %s", id, log)
results <- result
}
}
func main() {
jobs := make(chan string, 100)
results := make(chan string, 100)
var wg sync.WaitGroup
numWorkers := 5
for w := 1; w <= numWorkers; w++ {
wg.Add(1)
go worker(w, jobs, results, &wg)
}
logs := []string{"log1", "log2", "log3", "log4"}
for _, log := range logs {
jobs <- log
}
close(jobs)
go func() {
wg.Wait()
close(results)
}()
for res := range results {
fmt.Println(res)
}
}
Здесь канал jobs передаёт задачи воркерам, а канал results собирает результаты. WaitGroup ждёт завершения всех воркеров, после чего закрывает results для чтения.