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 main
2
3import (
4"fmt"
5"sync"
6)
7
8type Task struct {
9ID int
10Data string
11}
12
13type WorkerPool struct {
14tasks chan Task
15wg sync.WaitGroup
16workers int
17}
18
19func 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}
7
8func (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 <- task
3}
4
5func (wp *WorkerPool) Wait() {
6close(wp.tasks)
7wp.wg.Wait()
8}
9
10func main() {
11pool:= NewWorkerPool(3)
12pool.Start()
13
14// 10 görev ekle
15for i:= 1; i <= 10; i++ {
16pool.Submit(Task{ID: i, Data: fmt.Sprintf("Görev-%d", i)})
17}
18
19pool.Wait()
20fmt.Println("Tüm görevler tamamlandı")
21}

Beklenen çıktı:

1Worker 0 işliyor: Task 1 - Görev-1
2Worker 1 işliyor: Task 2 - Görev-2
3Worker 2 işliyor: Task 3 - Görev-3
4Worker 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 int
3Output string
4}
5
6func (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 <- result
14}
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)

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz

5 yorum

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    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

  • adlı kullanıcıya yanıt verdi
    kahvekokusu

    anladım yani birbirinden bağımsız çalışan küçük işçiler gibi hepsi aynı anda farklı

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    aynen kardeş goroutinei sadece hafif bir işçi gibi düşün her biri aynı anda işi yapıyor

  • kahvekokusu

    ay çok karışık geldi bu konu bence goroutine filan ne demek ya ama anlıyorum ki sınırlı

  • adlı kullanıcıya yanıt verdi
    kahvekokusu

    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