Lompat ke konten Lompat ke sidebar Lompat ke footer

Golang Concurrency #12

 Pada contoh pipeline tersebut, memang ada operasi blocking, tetapi itu adalah perilaku yang diharapkan dan sengaja dibuat.

Berikut penjelasannya:

  1. 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.
  2. Di Goroutine Utama:

    • Di main(), kita hanya melakukan loop for 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 sum ditutup, loop for range sum di goroutine utama akan berhenti.
  3. 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).
  4. 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!