İş kuyruğu
- Go kursu
- Orta seviye
- Ders 26/80
- 6 dk
İş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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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
for _, is := range liste {
isler <- is
}
____(isler)
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 |