Golang Concurrency #18
Berikut adalah contoh lain yang efisien menggunakan concurrency untuk melakukan parallel sum (menghitung jumlah total dari potongan data secara paralel).
Contoh ini memecah sebuah slice angka menjadi beberapa bagian, menghitung jumlah (sum) untuk setiap bagian secara concurrent, kemudian menggabungkan hasilnya.
Kode: Parallel Sum dengan Goroutine, Channel, dan WaitGroup
Penjelasan Mekanisme:
Pembagian Data (Chunking):
- Data
numbersdibagi ke dalam beberapa bagian (chunk) berdasarkan jumlah worker. - Misal, dengan 10 angka dan 3 worker, masing-masing worker akan memproses sekitar 4 angka (pembagian dihitung agar semua data tercakup).
- Data
Eksekusi Concurrent dengan Goroutine:
- Untuk setiap chunk, kita memanggil sebuah goroutine untuk menghitung partial sum.
- Setiap goroutine mengirimkan hasilnya ke channel
results.
Sinkronisasi dengan WaitGroup:
sync.WaitGroupmemastikan bahwa kita menunggu semua goroutine selesai.- Setelah semua goroutine selesai (wg.Wait()), channel
resultsditutup agar loop pembacaan (for range) di main bisa berhenti.
Penggabungan Hasil:
- Goroutine utama membaca dari channel
resultsdan mengakumulasi semua partial sum menjadi total sum.
- Goroutine utama membaca dari channel
Keuntungan Pendekatan Ini:
Efisiensi:
Dengan memecah pekerjaan dan menjalankannya secara concurrent, total waktu komputasi dapat berkurang, terutama jika data besar dan ada banyak core CPU.Sederhana dan Aman:
Penggunaan channel dan WaitGroup membantu sinkronisasi antar goroutine tanpa memerlukan mekanisme penguncian (mutex) secara manual.Skalabilitas:
Pendekatan ini dapat dengan mudah disesuaikan dengan jumlah worker yang diinginkan, tergantung pada sumber daya yang tersedia.
Contoh ini merupakan pola yang berguna untuk mempercepat proses komputasi dengan membagi pekerjaan ke beberapa goroutine dan menggabungkan hasilnya secara efisien. Jika ada pertanyaan atau ingin contoh lain, silakan ditanyakan!