Lompat ke konten Lompat ke sidebar Lompat ke footer

Golang Concurrency #17

 Dalam contoh tersebut, tidak digunakan WaitGroup atau penutupan channel karena kita sudah mengetahui dengan pasti jumlah tugas yang akan menghasilkan output, yaitu 3. Berikut mekanismenya:

  1. Jumlah Tugas Diketahui:

    • Kita menjalankan 3 goroutine (tugas) dan masing-masing tugas akan mengirim tepat 1 pesan ke channel.
    • Di main(), kita menggunakan loop for i := 0; i < 3; i++ untuk membaca 3 pesan.
    • Karena jumlah pesan yang diharapkan sudah tetap, kita tidak perlu menutup channel untuk menandakan "selesai" karena kita sudah tahu kapan berhenti membaca.
  2. Mengapa Tidak Menggunakan WaitGroup?

    • WaitGroup biasanya digunakan ketika kita tidak mengetahui atau ingin menunggu semua goroutine selesai sebelum melanjutkan.
    • Di sini, kita tidak perlu menunggu secara eksplisit karena kita sudah mendesain logika untuk membaca 3 pesan (sesuai jumlah goroutine) dan setelah itu main() selesai.
  3. Keamanan Tanpa Menutup Channel:

    • Tidak menutup channel tidak masalah di sini karena kita tidak menggunakan loop for range yang bergantung pada penutupan channel untuk berhenti.
    • Kita secara eksplisit membaca sejumlah pesan yang sudah diketahui.
    • Channel juga dibuat dengan buffer yang cukup (ukuran 3) sehingga setiap goroutine dapat menulis pesan tanpa terblokir jika main() belum segera membaca.
  4. Mekanisme Keseluruhan:

    • Setiap goroutine menjalankan longRunningTask yang akan mengirim 1 pesan ke channel results, baik hasil tugas selesai ataupun pesan pembatalan.
    • Goroutine utama membaca tepat 3 pesan dari channel tersebut.
    • Karena jumlah pesan sudah diketahui dan tidak ada pengiriman tambahan setelah itu, tidak terjadi kebocoran atau deadlock meskipun channel tidak ditutup.

Kesimpulan:
Pendekatan ini aman selama kita tahu pasti jumlah pesan yang akan dikirim. Jika jumlahnya dinamis atau tidak diketahui, biasanya kita akan menggunakan WaitGroup untuk menunggu semua goroutine selesai dan menutup channel agar loop pembacaan (misalnya, for range) bisa berhenti secara otomatis.