Go'da Eş Zamanlılık Desenleri: Worker Pool Uygulaması
Worker pool, belirli sayıda goroutine'in bir kuyruktan görev alıp işlemesi desenidir. Sınırsız goroutine açmak yerine kontrollü bir havuz kullanarak bellek ve CPU'yu verimli kullanırsınız.
Her görev için yeni goroutine açarsanız sistem çöker. Worker pool, kaynakları sınırlandırır. Örneğin 1000 API isteğini 10 worker ile işleyebilirsiniz.
Worker pool'u oluşturmak için channel ve goroutine'ler kullanırız:
1package main23import (4"fmt"5"sync"6)78type Task struct {9ID int10Data string11}1213type WorkerPool struct {14tasks chan Task15wg sync.WaitGroup16workers int17}1819func NewWorkerPool(workers int) *WorkerPool {20return &WorkerPool{21tasks: make(chan Task, workers),22workers: workers,23}24}Her worker, channel'dan görev alıp işler:
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1func (wp *WorkerPool) Start() {2for i:= 0; i < wp.workers; i++ {3wp.wg.Add(1)4go wp.worker(i)5}6}78func (wp *WorkerPool) worker(id int) {9defer wp.wg.Done()10for task:= range wp.tasks {11fmt.Printf("Worker %d işliyor: Task %d - %s\n", id, task.ID, task.Data)12}13}1func (wp *WorkerPool) Submit(task Task) {2wp.tasks <- task3}45func (wp *WorkerPool) Wait() {6close(wp.tasks)7wp.wg.Wait()8}910func main() {11pool:= NewWorkerPool(3)12pool.Start()1314// 10 görev ekle15for i:= 1; i <= 10; i++ {16pool.Submit(Task{ID: i, Data: fmt.Sprintf("Görev-%d", i)})17}1819pool.Wait()20fmt.Println("Tüm görevler tamamlandı")21}Beklenen çıktı:
1Worker 0 işliyor: Task 1 - Görev-12Worker 1 işliyor: Task 2 - Görev-23Worker 2 işliyor: Task 3 - Görev-34Worker 0 işliyor: Task 4 - Görev-4...5Tüm görevler tamamlandıGörevlerin sonucunu almak için başka bir channel ekleyin:
1type Result struct {2TaskID int3Output string4}56func (wp *WorkerPool) worker(id int, results chan Result) {7defer wp.wg.Done()8for task:= range wp.tasks {9result:= Result{10TaskID: task.ID,11Output: fmt.Sprintf("Worker %d tamamladı", id),12}13results <- result14}15}Worker pool, goroutine'leri kontrol altında tutarak eş zamanlı işlemleri verimli hale getirir. Channel'lar görevleri dağıtır, sync.WaitGroup tamamlanmayı bekler. (Go'da Dosya İşlemleri: Okuma, Yazma ve Hata Yönetimi)
5 yorum
ay çok karışık geldi bu konu bence goroutine filan ne demek ya ama anlıyorum ki sınırlı
aynen kardeş goroutinei sadece hafif bir işçi gibi düşün her biri aynı anda işi yapıyor
anladım yani birbirinden bağımsız çalışan küçük işçiler gibi hepsi aynı anda farklı
aynen tam öyle ama farkı şu 10 işçi varsa 1000 iş geldiğinde hepsi sıraya girip bekliyor biri bitirse diğeri alıyor sonsuz işçi açarsanız sistem
vay işte o zaman kuyruk işin içine giriyor anladığım kadarıyla yani görevler bekliyor ve boş işçi bulduktan sonra başlıyor