Özet - Worker Pool
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 66 / 107.
Görev
KolayWorker pool desenini kullanarak bir görev işleme sistemi oluşturalım! İş yüklerini verimli bir şekilde işlemek üzere kanalların, goroutine'lerin ve WaitGroup'ların birlikte nasıl çalıştığını göstererek hesaplama görevlerini eşzamanlı olarak işleyen bir worker havuzu oluşturacaksın.
Kodunu iki dosya arasında düzenleyeceksin:
pool.go: Worker pool bileşenlerini ve mantığını tanımla.Yapılacak işi temsil eden
Task(int) veID(int) alanlarına sahip birValuestruct'ı oluştur.Tamamlanan işi temsil eden
Result(int) veTaskID(int) alanlarına sahip birComputedstruct'ı oluştur.Bir worker ID'si (int), yalnızca alım yapan bir görev kanalı (
Worker), yalnızca gönderim yapan bir sonuç kanalı (<-chan Task) ve birchan<- Resultişaretçisi alan birsync.WaitGroupişlevi uygula. Her worker şunları yapmalıdır:- Tamamlanmayı bildirmek için
defer wg.Done()kullan - Her görevi işlemek için görev kanalı üzerinde yinele
- Her görev için görevin Value değerinin karesini hesapla
- TaskID ve hesaplanan kare ile bir Result gönder
Worker sayısını (int) ve bir görev dilimini alan bir
RunPoolişlevi uygula. Bu işlev şunları yapmalıdır:- Görevler ve sonuçlar için arabelleğe alınmış kanallar oluştur (arabellek boyutu olarak görev sayısını kullan)
- Belirtilen sayıda worker'ı goroutine olarak başlat
- Tüm görevleri görev kanalına gönder, ardından kanalı kapat
- Tüm worker'lar tamamlandıktan sonra sonuç kanalını kapatmak için WaitGroup ile bir goroutine kullan
- Tüm sonuçları bir dilimde topla ve döndür
- Tamamlanmayı bildirmek için
main.go: Girdiyi oku ve worker pool'u koordine et.Worker sayısını, ardından görev sayısını oku. Her görev için ID'sini ve değerini oku. Worker'lar ve görevlerle
RunPoolişlevini çağır, ardından her sonucu şu biçimde yazdır:Task [TaskID]: [Computed]Sonuçları TaskID'ye göre artan düzende sıralayarak yazdır.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Worker sayısı (tam sayı)
- 2. satır: Görev sayısı (tam sayı)
- Sonraki satırlar: Her görev için iki satır — görev ID'si (tam sayı), ardından değeri (tam sayı)
Örneğin, şu verildiğinde:
2
4
1
3
2
5
3
2
4
7Çıktın şöyle olmalıdır:
Task 1: 9
Task 2: 25
Task 3: 4
Task 4: 49Worker'lar görevleri eşzamanlı olarak işler (3'ün karesi 9, 5'in karesi 25'tir vb.) ve sonuçlar toplanarak görev ID'sine göre sıralı şekilde görüntülenir. 4 görevi 2 worker işlediğinde iş, pool genelinde verimli bir şekilde dağıtılır.
Kendin dene
package main
import (
"fmt"
"sort"
)
func main() {
// İşçi sayısını oku
var numWorkers int
fmt.Scanln(&numWorkers)
// Görev sayısını oku
var numTasks int
fmt.Scanln(&numTasks)
// Görevleri oku
tasks := make([]Task, numTasks)
for i := 0; i < numTasks; i++ {
var id, value int
fmt.Scanln(&id)
fmt.Scanln(&value)
tasks[i] = Task{ID: id, Value: value}
}
// YAPILACAK: RunPool'u işçiler ve görevlerle çağır
// YAPILACAK: Sonuçları TaskID'ye göre artan sırada sırala
// YAPILACAK: Her sonucu şu formatta yazdır: Task [TaskID]: [Computed]
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi