Golang Concurrency #12
Pada contoh pipeline tersebut, memang ada operasi blocking, tetapi itu adalah perilaku yang diharapkan dan sengaja dibuat.
Berikut penjelasannya:
Di Setiap Tahap Pipeline:
- Setiap fungsi (generator, multiplier, adder) menjalankan goroutine-nya sendiri dan menggunakan loop
for n := range in. - Loop tersebut akan blocking (menunggu) jika channel belum ada data. Jadi, misalnya, di tahap multiplier, jika channel dari generator belum mengirimkan data, maka goroutine multiplier akan menunggu. Ini merupakan perilaku normal pada channel di Go.
- Setiap fungsi (generator, multiplier, adder) menjalankan goroutine-nya sendiri dan menggunakan loop
Di Goroutine Utama:
- Di
main(), kita hanya melakukan loopfor result := range sum { ... }untuk membaca hasil akhir dari pipeline. - Operasi ini juga blocking karena akan menunggu data dari channel
sum. - Namun, tidak perlu menggunakan
wg.Wait()di sini karena:- Setiap tahap pipeline bertanggung jawab untuk menutup channel mereka sendiri setelah selesai (misalnya,
close(out)dipanggil setelah loop selesai di setiap goroutine). - Begitu channel
sumditutup, loopfor range sumdi goroutine utama akan berhenti.
- Setiap tahap pipeline bertanggung jawab untuk menutup channel mereka sendiri setelah selesai (misalnya,
- Di
Kenapa Tidak Perlu WaitGroup?
- Karena alur pipeline sudah dirancang sedemikian rupa sehingga setiap goroutine yang menghasilkan data juga menutup channel-nya setelah selesai.
- Dengan demikian, mekanisme penutupan channel ini memastikan bahwa goroutine utama tahu kapan sudah tidak ada lagi data (tanpa perlu eksplisit menunggu semua goroutine selesai menggunakan WaitGroup).
Apakah Ini Blocking?
- Ya, secara teknis operasi membaca channel bersifat blocking.
- Tetapi, ini bukanlah masalah karena:
- Blocking pada channel merupakan cara untuk menyinkronkan aliran data antar goroutine.
- Goroutine utama akan menunggu (blocking) sampai ada data, dan begitu data sudah habis (channel tertutup), maka loop berhenti secara otomatis.
- Ini memastikan bahwa data diproses secara berurutan dari pipeline dan tidak terjadi busy-waiting.
Kesimpulan:
Meskipun tidak ada pemanggilan eksplisit wg.Wait() di goroutine utama, mekanisme blocking pada channel dan penutupan channel di setiap tahap sudah memastikan bahwa program akan berhenti membaca setelah semua data selesai diproses. Ini adalah pendekatan yang umum dan efisien dalam pola pipeline pada Go.
Jika ada pertanyaan lain atau masih belum jelas, silakan ditanyakan kembali!