Lompat ke konten Lompat ke sidebar Lompat ke footer

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:

  1. Goroutine di Dalam Setiap Fungsi Pipeline

    • Pada fungsi generator, ada kode seperti ini:

      go func() { for _, n := range nums { out <- n } close(out) }()

      Di sini, fungsi anonim dijalankan sebagai goroutine. Jadi, ketika generator dipanggil, ia segera mengembalikan channel out, dan secara bersamaan goroutine baru berjalan untuk mengirim data ke channel tersebut.

    • Hal yang sama terjadi pada fungsi multiplier dan adder. Masing-masing memulai goroutine dengan go func() { ... }() untuk memproses data.

  2. 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 in di multiplier) membuat tahap itu menunggu data dari tahap sebelumnya. Namun, karena tahap sebelumnya juga berjalan di goroutine tersendiri, data akan mengalir saat tersedia.

  3. Peran Fungsi main
    Fungsi main hanya menghubungkan tahap-tahap pipeline dengan mengambil channel keluaran dari masing-masing fungsi. Meskipun main tidak secara eksplisit memanggil go, 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.

  4. 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 main tampak 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.