Golang Concurrency #6
Ketika goroutine utama melakukan loop pada channel dengan pola:
maka mekanisme yang terjadi adalah blocking read pada channel. Artinya, jika tidak ada data yang tersedia di channel, goroutine utama akan menunggu (blocking) sampai ada data yang dikirim oleh goroutine lain.
Berikut penjelasannya:
Blocking pada Channel:
Saat kamu menulisresult := <-results, jika channelresultsbelum memiliki data, maka operasi ini akan memblokir (menunggu) hingga data tersedia. Hal ini memastikan bahwa goroutine utama tidak melakukan busy waiting dan hanya akan berjalan ketika ada data yang bisa diproses.Channel Masih Terbuka:
Selama channel belum ditutup, setiap kali goroutine utama membaca dari channel, ia akan terus menunggu (jika data belum ada) hingga ada data yang dikirim oleh goroutine worker. Proses pengiriman data oleh worker goroutine terjadi secara concurrent.Penutupan Channel oleh Goroutine Terpisah:
Pada implementasi pertama, kita membuat goroutine terpisah yang menjalankan:Dengan pola ini, ketika semua worker goroutine selesai (wg counter mencapai 0), channel akan ditutup. Setelah channel ditutup, loop
for result := range resultsdi goroutine utama akan berhenti secara otomatis setelah membaca semua data yang ada.Tidak Terjadi Deadlock:
Karena channel dalam contoh tersebut dibuat dengan buffer (misalnyamake(chan string, len(urls))), worker goroutine dapat mengirimkan data ke channel tanpa harus tergantung pada goroutine utama yang segera membaca data. Bahkan jika goroutine utama belum siap membaca, data akan tetap masuk ke buffer channel.- Jika Channel Tidak Buffered:
Jika channel tidak buffered, worker goroutine akan terblokir saat mengirim data jika goroutine utama belum membaca. Namun, ini juga bukan masalah selama desain aplikasinya telah memperhitungkan hal tersebut. Biasanya, menggunakan channel buffered adalah pilihan yang aman untuk kasus seperti ini.
- Jika Channel Tidak Buffered:
Kesimpulan:
- Saat goroutine utama membaca dari channel, jika belum ada data, ia akan secara otomatis menunggu hingga data tersedia.
- Setelah data dikirim dan channel masih terbuka, goroutine utama akan melanjutkan membaca data satu per satu.
- Proses ini tidak menyebabkan masalah, justru merupakan mekanisme dasar pada channel di Golang yang mendukung komunikasi antar goroutine dengan aman.
Semoga penjelasan ini membantu memahami bagaimana mekanisme blocking pada channel bekerja dan mengapa tidak terjadi masalah meskipun data dari goroutine lain belum tersedia saat goroutine utama mulai loop pada channel. Jika masih ada pertanyaan, silakan ditanyakan kembali!