Golang Concurrency #5
Mari kita coba jelaskan mekanismenya secara lebih rinci, dengan ilustrasi perbedaan penempatan wg.Wait() dan penutupan channel di dalam goroutine terpisah dibandingkan jika diletakkan di goroutine utama.
1. Mekanisme Dasar wg.Wait() dan Penutupan Channel
wg.Wait():
Ini adalah panggilan yang blokir (blocking) eksekusi hingga counter padaWaitGroupmencapai 0. Artinya, eksekusi akan berhenti sampai semua goroutine yang telah menambahkan counter (denganwg.Add()) telah memanggilwg.Done().close(channel):
Menutup channel menandakan bahwa tidak ada lagi data yang akan dikirim ke channel tersebut. Saat channel ditutup, loop pembacaan (misalnyafor result := range channel) akan berhenti.
2. Pola Umum: Menutup Channel dalam Goroutine Terpisah
Contoh Pola:
Mengapa dilakukan seperti ini?
Non-blocking untuk Goroutine Utama:
Dengan menempatkanwg.Wait()dan penutupan channel di goroutine terpisah, goroutine utama bisa langsung melanjutkan untuk membaca data dari channel secara konkurens (concurrent) saat worker goroutine mengirimkan hasilnya.Loop Pembacaan yang Lancar:
Loopfor result := range resultsdi goroutine utama akan terus membaca data yang masuk. Ketika semua worker selesai, goroutine terpisah akan memanggilclose(results), sehingga loop pembacaan akan berhenti secara otomatis.
3. Jika Ditempatkan di Goroutine Utama
Misalkan kita ubah dan meletakkan wg.Wait() dan penutupan channel langsung di goroutine utama:
Apa yang terjadi pada pola ini?
Goroutine Utama Menunggu Semua Selesai:
Di sini, goroutine utama akan memanggilwg.Wait()dan menunggu sampai semua worker goroutine selesai. Selama periode ini, goroutine utama tidak melakukan apa-apa—ia hanya menunggu.Penggunaan Channel Buffered:
Karena kita membuat channel dengan kapasitas (buffer) sebesar jumlah URL (len(urls)), worker goroutine dapat mengirimkan hasilnya ke channel tanpa harus menunggu goroutine utama untuk segera membacanya.
Jika channel tidak buffered, worker bisa terblokir jika goroutine utama tidak membaca, yang dapat menyebabkan deadlock.Pembacaan Hasil Setelah Semua Selesai:
Setelahwg.Wait()selesai, baru goroutine utama menutup channel dan mulai membaca semua hasil.
Kelebihannya:- Lebih sederhana jika kamu tidak perlu memproses data secara real-time (sambil menunggu).
Kekurangannya: - Jika ada banyak data, mungkin kamu kehilangan kesempatan untuk mulai memproses data segera, sehingga waktu respon keseluruhan bisa terasa lebih lama.
- Lebih sederhana jika kamu tidak perlu memproses data secara real-time (sambil menunggu).
4. Perbandingan Antara Kedua Pola
Menempatkan
wg.Wait()danclose(results)di Goroutine Terpisah:- Pro:
- Pemrosesan Data Real-Time: Goroutine utama bisa mulai membaca data dari channel segera setelah data tersedia.
- Responsif: Hasil bisa langsung diproses tanpa harus menunggu seluruh pekerjaan selesai.
- Kontra:
- Sedikit Kompleksitas Tambahan: Ada goroutine ekstra untuk menunggu dan menutup channel, tetapi ini biasanya tidak menjadi masalah.
- Pro:
Menempatkan
wg.Wait()danclose(results)di Goroutine Utama:- Pro:
- Implementasi Sederhana: Alur kode lebih linier dan mudah dipahami untuk kasus sederhana.
- Kontra:
- Tidak Ada Pemrosesan Paralel Hasil: Goroutine utama tidak akan membaca channel sampai semua worker selesai.
- Risiko Deadlock Jika Channel Tidak Buffered: Jika channel tidak dibuat dengan buffer yang cukup, worker bisa terblokir saat menulis ke channel karena goroutine utama tidak membaca.
- Pro:
Kesimpulan
- Menggunakan goroutine terpisah untuk
wg.Wait()dan penutupan channel memungkinkan pemrosesan hasil secara konkuren dan lebih responsif, terutama bila hasil perlu segera diproses. - Jika diletakkan di goroutine utama, maka eksekusi akan blokir sampai semua pekerjaan selesai, dan pembacaan hasil baru dimulai. Pendekatan ini cocok untuk kasus di mana pemrosesan data setelah selesai semua pekerjaan tidak menjadi masalah.
- Penting: Pastikan channel memiliki buffer yang cukup jika memilih pola di mana goroutine utama menunggu sebelum membaca, untuk menghindari deadlock.
Semoga penjelasan dan contoh ini membantu memperjelas mekanisme tersebut! Jika masih ada pertanyaan atau perlu contoh tambahan, silakan tanyakan.