Ringkasan: Worker Pool
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 66 dari 107.
Tantangan
MudahMari 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
Taskdengan fieldID(int) danValue(int) yang mewakili pekerjaan yang harus dilakukan.Buat struct
Resultdengan fieldTaskID(int) danComputed(int) yang mewakili pekerjaan yang sudah selesai.Implementasikan fungsi
Workeryang menerima ID worker (int), channel tugas khusus penerima (<-chan Task), channel hasil khusus pengirim (chan<- Result), dan pointer kesync.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
RunPoolyang 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
- Menggunakan
main.go: Baca input dan koordinasikan worker pool.Baca jumlah worker, lalu jumlah tugas. Untuk setiap tugas, baca ID dan nilainya. Panggil
RunPooldengan 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
7Outputmu seharusnya:
Task 1: 9
Task 2: 25
Task 3: 4
Task 4: 49Worker 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
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online