Menu
CoddyTech

Ringkasan: Worker Pool

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 66 dari 107.

challenge icon

Tantangan

Mudah

Mari buat sistem pemrosesan tugas menggunakan pola worker pool! Kamu akan membuat pool worker yang memproses tugas komputasi secara bersamaan, untuk menunjukkan cara channel, goroutine, dan WaitGroup bekerja sama menangani beban kerja secara efisien.

Kamu akan mengatur kodemu dalam dua file:

  • pool.go: Definisikan komponen dan logika worker pool.

    Buat struct Task dengan field ID (int) dan Value (int) yang mewakili pekerjaan yang harus dilakukan.

    Buat struct Result dengan field TaskID (int) dan Computed (int) yang mewakili pekerjaan yang sudah selesai.

    Implementasikan fungsi Worker yang menerima ID worker (int), channel tugas khusus penerima (<-chan Task), channel hasil khusus pengirim (chan<- Result), dan pointer ke sync.WaitGroup. Setiap worker harus:

    • Menggunakan defer wg.Done() untuk menandakan bahwa tugasnya sudah selesai
    • Melakukan iterasi pada channel tugas untuk memproses setiap tugas
    • Menghitung kuadrat dari Value tugas untuk setiap tugas
    • Mengirim Result yang berisi TaskID dan hasil kuadrat

    Implementasikan fungsi RunPool yang menerima jumlah worker (int) dan slice tugas. Fungsi ini harus:

    • Membuat channel buffer untuk tugas dan hasil, gunakan jumlah tugas sebagai ukuran buffer
    • Memulai jumlah worker yang ditentukan sebagai goroutine
    • Mengirim semua tugas ke channel tugas, lalu menutupnya
    • Menggunakan goroutine dengan WaitGroup untuk menutup channel hasil setelah semua worker selesai
    • Mengumpulkan semua hasil ke dalam slice dan mengembalikannya

  • main.go: Baca input dan koordinasikan worker pool.

    Baca jumlah worker, lalu jumlah tugas. Untuk setiap tugas, baca ID dan nilainya. Panggil RunPool dengan worker dan tugas, lalu cetak setiap hasil dengan format: Task [TaskID]: [Computed]

    Cetak hasil yang diurutkan berdasarkan TaskID secara menaik.

Input berikut akan diberikan:

  • Baris 1: Jumlah worker (bilangan bulat)
  • Baris 2: Jumlah tugas (bilangan bulat)
  • Baris-baris berikutnya: Untuk setiap tugas, dua baris, ID tugas (bilangan bulat), lalu nilainya (bilangan bulat)

Contohnya, jika diberikan:

2
4
1
3
2
5
3
2
4
7

Outputmu seharusnya:

Task 1: 9
Task 2: 25
Task 3: 4
Task 4: 49

Worker memproses tugas secara bersamaan (3 kuadrat adalah 9, 5 kuadrat adalah 25, dan seterusnya), lalu hasilnya dikumpulkan dan ditampilkan berdasarkan urutan TaskID. Dengan 2 worker yang menangani 4 tugas, pekerjaan didistribusikan ke seluruh pool secara efisien.

Coba sendiri

package main

import (
	"fmt"
	"sort"
)

func main() {
	// Baca jumlah pekerja
	var numWorkers int
	fmt.Scanln(&numWorkers)

	// Baca jumlah tugas
	var numTasks int
	fmt.Scanln(&numTasks)

	// Baca tugas
	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}
	}

	// TODO: Panggil RunPool dengan pekerja dan tugas

	// TODO: Urutkan hasil berdasarkan TaskID dari kecil ke besar

	// TODO: Cetak setiap hasil dengan format: Task [TaskID]: [Computed]
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online