Worker pool iskeleti
- Go kursu
- Orta seviye
- Ders 25/80
- 6 dk
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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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ı
func isci(id int, isler ____ Is, sonuclar chan<- Sonuc) {
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 |