CodeBlanks Logo Icon CodeBlanks

Worker pool iskeleti

Worker pool yapısını ve channel'ları tasarlarsın.

Proje: worker pool

Bu projede dosya boyutlarını hesaplayan bir iş havuzu kuracaksın. Bir worker pool üç parçadan oluşur: iş kanalı (yapılacaklar), sabit sayıda işçi (goroutine) ve sonuç kanalı.

isler   := make(chan Is)
sonuclar := make(chan Sonuc)
for w := 1; w <= 3; w++ {
    go isci(w, isler, sonuclar)
}

İşçi sayısını sabit tutmak, binlerce iş olsa bile kaynak kullanımını öngörülebilir kılar.

Türleri tanımla

Önce iş ve sonuç türleri yazılır; kanallar bu türleri taşır:

type Is struct {
    ID  int
    Yol string
}

type Sonuc struct {
    IsID  int
    Boyut int64
    Hata  error
}

Sonucun içinde hata alanı bulunması, bir işin başarısız olmasının tüm havuzu durdurmamasını sağlar.

Uygulama Havuz iskeleti

Is ve Sonuc türlerini tanımla. isci(isler <-chan Is, sonuclar chan<- Sonuc) her iş için Sonuc{IsID: is.ID, Boyut: int64(len(is.Yol))} göndersin. Tek işçiyle Is{1, "a.txt"} işini çalıştırıp sonucun Boyut alanını yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

type Is struct {
    ID  int
    Yol string
}

type Sonuc struct {
    IsID  int
    Boyut int64
    Hata  error
}

func isci(isler <-chan Is, sonuclar chan<- Sonuc) {
    for is := range isler {
        sonuclar <- Sonuc{IsID: is.ID, Boyut: int64(len(is.Yol))}
    }
}

func main() {
    isler := make(chan Is, 1)
    sonuclar := make(chan Sonuc, 1)
    go isci(isler, sonuclar)
    isler <- Is{1, "a.txt"}
    close(isler)
    fmt.Println((<-sonuclar).Boyut)
}

Beklenen çıktı

5

Soru ve cevaplar

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

1 Neden her iş için ayrı goroutine açmak yerine havuz kullanılır?

  • Goroutine açmak yasak olduğu için
  • Kanallar yalnızca havuzda çalıştığı için
  • GC'yi kapatmak için
  • Eşzamanlı iş sayısını (dosya tanıtıcısı, bağlantı) sınırlamak için Doğru cevap

Açıklama: Goroutine ucuzdur ama her iş dosya açıyor ya da istek atıyorsa sınırsız eşzamanlılık sistem kaynaklarını tüketir.

2 Yalnızca okuma kanalı

Soru
func isci(id int, isler ____ Is, sonuclar chan<- Sonuc) {
Cevap
func isci(id int, isler <-chan Is, sonuclar chan<- Sonuc) {

Açıklama: <-chan Is, işçinin kanaldan yalnızca okuyabileceğini derleyiciye söyler.

3 Havuz parçası

Kavram Anlamı
isler Yapılacak işler
isci Sabit sayıda goroutine
sonuclar Çıktılar
Sonuc.Hata İş bazında hata

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