Lompat ke konten Lompat ke sidebar Lompat ke footer

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.