Sobes.tech
Back to questions
Middle+
6

Как распараллелить обработку логов с использованием worker pool? Как получать результаты из горутин?

Companies where asked
X5 groupX5 group

Answer from AI

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 для чтения.