Golang Concurrency #14
Fungsi multiplier tidak menunggu fungsi generator selesai sepenuhnya sebelum dijalankan. Sebaliknya, mereka berjalan secara asynchronous dalam goroutine masing-masing dan bekerja secara sinkron melalui channel.
Mekanisme Eksekusi Antar Function dalam Pipeline
Generator dimulai lebih dulu dalam goroutine:
- Ia mulai mengirim angka ke channel gen.
- Jika tidak ada yang membaca dari gen, generator akan blocking sampai ada pembaca.
Multiplier berjalan di goroutine sendiri:
- Begitu ada data di gen, multiplier mengambilnya, mengalikannya, dan mengirim hasilnya ke channel berikutnya (mul).
- Jika tidak ada data, multiplier akan blocking sampai generator mengirim angka.
Adder berjalan di goroutine sendiri:
- Begitu ada data di mul, adder mengambilnya, menambahkannya, dan mengirim hasilnya ke sum.
- Jika tidak ada data, adder akan blocking sampai multiplier mengirim angka.
Goroutine utama membaca dari sum:
- Jika belum ada hasil di sum, ia akan blocking dan menunggu sampai adder mengirim hasil.
Kesimpulan
- Generator, multiplier, dan adder berjalan secara asynchronous (bersamaan) dalam goroutine masing-masing.
- Tidak ada yang menunggu fungsi lain selesai sepenuhnya.
- Setiap fungsi hanya akan melanjutkan prosesnya jika data sudah tersedia dari channel sebelumnya.
- Pipeline ini bersifat self-regulating, karena tiap stage hanya berjalan saat ada data yang masuk, sehingga tidak menyebabkan deadlock atau busy-waiting.
Jika generator mengirimkan data secara perlahan, pipeline akan menyesuaikan secara otomatis:
✅ Multiplier tidak berjalan lebih dulu, ia menunggu generator.
✅ Adder tidak berjalan lebih dulu, ia menunggu multiplier.
✅ Main tidak selesai lebih dulu, ia menunggu adder.
Inilah kelebihan menggunakan channel di Go: komunikasi antar goroutine terjadi secara alami tanpa perlu mekanisme manual seperti mutex atau polling.