CodeBlanks Logo Icon CodeBlanks

İş kuyruğu

İşleri channel üzerinden worker'lara dağıtırsın.

İş kuyruğu ve dağıtım

İşleri gönderen kod (üretici) ayrı bir goroutine'de çalışır ve iş bitince kanalı kapatır. Kapatma, işçilere "başka iş yok" sinyalidir; range döngüleri kendiliğinden biter.

go func() {
    for i, yol := range dosyalar {
        isler <- Is{ID: i, Yol: yol}
    }
    close(isler)
}()

Kanalı yalnızca gönderen taraf kapatır; okuyan taraf kapatmaz.

Arabellek boyutu

İş kanalına küçük bir arabellek (make(chan Is, 100)) vermek üreticinin işçilerden biraz önde gitmesine izin verir ve kısa beklemeleri yumuşatır. Ama arabellek bir eşzamanlılık çözümü değildir; doğru çalışan bir program arabelleksiz de çalışmalıdır. Çok büyük arabellek bellek tüketir ve geri basıncı (backpressure) gizler.

Uygulama Dağıtım

Ayrı bir goroutine'de []string{"a", "bb", "ccc"} dosyalarını isler kanalına gönderip kapat. Üç işçi her yolun uzunluğunu sonuclar'a göndersin. main üç sonucu okuyup toplamı yazdırsın.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

func main() {
    dosyalar := []string{"a", "bb", "ccc"}
    isler := make(chan string)
    sonuclar := make(chan int)
    for w := 0; w < 3; w++ {
        go func() {
            for yol := range isler {
                sonuclar <- len(yol)
            }
        }()
    }
    go func() {
        for _, d := range dosyalar {
            isler <- d
        }
        close(isler)
    }()
    toplam := 0
    for i := 0; i < len(dosyalar); i++ {
        toplam += <-sonuclar
    }
    fmt.Println(toplam)
}

Beklenen çıktı

6

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Üretici neden ayrı goroutine'de çalışır?

  • Kanal kapatmak için zorunlu olduğu için
  • Hata yakalamak için
  • Arabelleksiz kanalda gönderim, sonuçlar okunmadan kilitlenmesin diye Doğru cevap
  • Daha hızlı derlensin diye

Açıklama: main hem gönderip hem sonuç okursa, işçiler sonuç kanalında beklerken main iş kanalında bekleyebilir; ayrı üretici bu döngüyü kırar.

2 Sinyal ver

Soru
for _, is := range liste {
    isler <- is
}
____(isler)
Cevap
for _, is := range liste {
    isler <- is
}
close(isler)

Açıklama: close(isler) işçilerin range döngülerini bitirir.

3 Kim ne yapar?

Kavram Anlamı
Üretici İş gönderir ve kapatır
İşçi range ile okur
Arabellek Kısa beklemeleri yumuşatır
close "Başka iş yok" sinyali

Orta seviye bölümündeki tüm dersler