Lompat ke konten Lompat ke sidebar Lompat ke footer

Golang Concurrency #13

Ya, benar. Antara fungsi-fungsi dalam pipeline, operasi membaca dan menulis melalui channel memang bersifat blocking, namun ini adalah bagian dari mekanisme sinkronisasi yang disengaja.

Misalnya, dalam fungsi multiplier:

func multiplier(in <-chan int, factor int) <-chan int { out := make(chan int) go func() { for n := range in { out <- n * factor } close(out) }() return out }

Pada baris for n := range in, goroutine dalam fungsi multiplier akan blocking (menunggu) jika channel in—yang merupakan output dari fungsi generator—belum mengirimkan data. Artinya:

  • Jika belum ada data:
    Fungsi multiplier tidak akan melanjutkan eksekusi sampai generator mengirim data ke channel.

  • Jika ada data:
    Data tersebut segera diambil, diproses, dan hasilnya dikirim ke channel out.

Mekanisme blocking ini membuat setiap stage pipeline hanya melanjutkan prosesnya ketika ada data yang tersedia dari stage sebelumnya. Karena tiap fungsi dijalankan di goroutine terpisah, blocking di satu stage tidak menghalangi keseluruhan program—ia hanya menunggu data di tahap itu saja.

Jadi, meskipun antar fungsi terjadi blocking pada operasi channel, ini merupakan cara yang aman dan efisien untuk menyinkronkan aliran data antar stage dalam pipeline.