Golang Concurrency #8
Berikut adalah contoh implementasi worker pool menggunakan concurrency di Golang yang efisien. Contoh ini menggunakan beberapa worker untuk memproses serangkaian pekerjaan (jobs) secara paralel.
Kode Worker Pool
Penjelasan Kode
Definisi Struktur Data:
- Job: Mewakili sebuah pekerjaan dengan properti
iddanvalue. - Result: Menyimpan hasil dari pemrosesan sebuah job, termasuk job itu sendiri dan hasil perhitungannya.
- Job: Mewakili sebuah pekerjaan dengan properti
Fungsi Worker:
- Setiap worker berjalan di goroutine terpisah.
- Worker mengambil job dari channel
jobsdengan menggunakan loopfor range. Karenajobsadalah channel, loop ini akan berjalan sampai channel ditutup. - Setelah menyelesaikan sebuah job, worker mengirimkan hasilnya ke channel
results. defer wg.Done()memastikan bahwa setiap worker mengurangi counter WaitGroup setelah selesai.
Fungsi
main:- Mempersiapkan channel
jobsdanresultsdengan buffer yang sesuai untuk menghindari deadlock. - Meluncurkan sejumlah worker (dalam contoh ini 3) yang akan mendengarkan channel
jobs. - Mengirimkan sejumlah job ke channel
jobsdan kemudian menutup channel tersebut agar worker tahu bahwa tidak ada job baru. - Menunggu semua worker selesai dengan
wg.Wait(), lalu menutup channelresultsagar loop pembacaan di bagian akhir bisa berhenti. - Membaca dan menampilkan hasil dari channel
resultsdengan loopfor range.
- Mempersiapkan channel
Mengapa Pendekatan Ini Efisien?
Concurrency:
Worker bekerja secara paralel, sehingga pekerjaan dapat diproses bersamaan dan mengurangi total waktu pemrosesan.Penggunaan Channel:
Channel menjamin komunikasi yang aman antar goroutine tanpa perlu sinkronisasi manual (misalnya menggunakan mutex).Worker Pool:
Worker pool membantu membatasi jumlah goroutine yang berjalan secara bersamaan, menghindari overhead pembuatan goroutine yang berlebihan.Sinkronisasi dengan WaitGroup:
Menggunakansync.WaitGroupmemastikan bahwa program menunggu sampai semua worker selesai sebelum menutup channel dan melanjutkan pemrosesan hasil.
Contoh ini merupakan salah satu pola concurrency yang umum dan efisien di Golang. Jika ada pertanyaan lebih lanjut atau ingin eksplorasi contoh lain, silakan tanyakan!