Golang Concurrency #15
Meskipun di fungsi main kita tidak memanggil go secara eksplisit, masing-masing fungsi pipeline (seperti generator, multiplier, dan adder) sudah membuat goroutine sendiri di dalamnya. Mari kita bahas lebih detail:
Goroutine di Dalam Setiap Fungsi Pipeline
Pada fungsi
generator, ada kode seperti ini:Di sini, fungsi anonim dijalankan sebagai goroutine. Jadi, ketika
generatordipanggil, ia segera mengembalikan channelout, dan secara bersamaan goroutine baru berjalan untuk mengirim data ke channel tersebut.Hal yang sama terjadi pada fungsi
multiplierdanadder. Masing-masing memulai goroutine dengango func() { ... }()untuk memproses data.
Kenapa Pipeline Bisa Berjalan Asynchronous
Karena setiap tahap pipeline dijalankan di goroutine-nya sendiri, mereka berjalan secara konkuren. Mekanisme blocking yang terjadi di masing-masing stage (misalnya,for n := range indimultiplier) membuat tahap itu menunggu data dari tahap sebelumnya. Namun, karena tahap sebelumnya juga berjalan di goroutine tersendiri, data akan mengalir saat tersedia.Peran Fungsi
main
Fungsimainhanya menghubungkan tahap-tahap pipeline dengan mengambil channel keluaran dari masing-masing fungsi. Meskipunmaintidak secara eksplisit memanggilgo, ia menerima channel yang sudah diisi oleh goroutine yang berjalan di dalam fungsi pipeline tersebut. Jadi, alur asynchronous sudah terjadi secara internal di dalam masing-masing fungsi.Ringkasan Mekanisme
- Spawn Goroutine di Dalam Fungsi: Setiap fungsi pipeline langsung membuat goroutine-nya sendiri.
- Channel sebagai Penghubung: Masing-masing tahap berkomunikasi melalui channel. Jika data belum siap, operasi membaca (receive) akan blocking, tapi itu bukan masalah karena goroutine lain akan mengirim data saat sudah tersedia.
- Asynchronous Secara Implicit: Walaupun
maintampak linier, sebenarnya semua proses asynchronous sudah berjalan di latar belakang.
Dengan demikian, meskipun main tidak men-spawn goroutine secara eksplisit, kode di dalam fungsi-fungsi pipeline sudah mengatur agar eksekusi berjalan secara asynchronous dan terkoordinasi melalui channel.