Menu
Coddy logo textTech

Özet - Worker Pool

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 66 / 107.

challenge icon

Görev

Kolay

Worker 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) ve ID (int) alanlarına sahip bir Value struct'ı oluştur.

    Tamamlanan işi temsil eden Result (int) ve TaskID (int) alanlarına sahip bir Computed struct'ı 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 bir chan<- Result işaretçisi alan bir sync.WaitGroup iş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 RunPool iş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

  • 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 RunPool iş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: 49

Worker'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

Kendi başına pratik yap: Online Go derleyicisi