![avatar](https://indraoctama.com/img/profile.jpg)
Prolog
Salah satu kekuatan dalam bahasa Go adalah kehandalan dan kemudahan-nya dalam menangani banyak aktivitas dalam sekali jalannya suatu fungsi. Lalu saya bertanya-tanya kapan sih saatnya menggunakan fasilitas go-concurrency itu dalam kehidupan sehari-hari ceilah :D. Soalnya ya tutorial-tutorial yang saya baca selama ini pembahasannya terlalu berat, sebagai contoh ada yang bikin contoh data-data besar yang rasa-rasanya terlalu formal untuk dibaca dengan rasa kantuk hehe :D. Nah dari situlah tercetus ide gimana kalo bikin kasus yang ringan-ringan ajah. Ya contohnya download foto member JKT-48 yang pastinya akan menarik hehe.
Pembahasan
Saya mau ajak teman-teman untuk menikmati tutorial ini dengan fun yakni download file foto member JKT-48 yang URL-nya sudah saya provide. Pada intinya saya mau download foto dari 3 folder yang di dalamnya terdapat puluhan foto termuat disana dengan secara bersamaan. Walau dalam bersamaan tapi saya mau memastikan 3 proses tadi selesai dan semua foto berhasil saya download. Untuk memastikan bahwa proses-nya selesai, maka ada sesuatu yang menunggu satu sama lain proses-proses yang terjadi. Selalu mulai dari yang simple.
Wait Group
Tentunya teman-teman pasti punya kuota-lah untuk cari tau apa itu wait group. Hehe bercanda ding :D. Ya simple -nya sih ini fasilitas di Go untuk menunggu proses concurrency satu sama lain.
Channel
Seperti halnya wait group, channel juga berfungsi untuk menunggu satu sama lain proses yang terjadi, tetapi bedanya, channel ini mempunyai fasilitas untuk saling ngabarin lewat pesan yang kita definisikan data type-nya.
Implementasi
Supaya ngga terlalu panjang mungkin temen-teman bisa langsung ke sini -> https://github.com/indraoct/go-concurrency. Jadi yang saya bahas disini mungkin snipet-snipetnya saja:
- WaitGroup
Program dijalankan, akan mendapati hasil berikut:
Karena proses berjalan concurrently, maka start time terkesan hampir bersamaan, lalu diikuti proses secara silih berganti satu sama lain pada log dibawahnya. Lalu berikut ini adalah ending proses-nya
Ending dari folder Zee.
Ending dari folder Magic Hour.
Ending dari folder PonyTail (final).
Dari ke-3 ending tersebut, diketahui bahwa berakhirnya proses-proses tersebut tidak bersamaan. Karena ada script wg.Wait() tadi, sehingga proses keseluruhan aplikasi bisa ditahan sampe ke-3 proses tersebut terkonfirmasi selesai.
- Channel
Dalam contoh tersebut lihatlah part ch <- data disinilah letak proses pengabaran pesan oleh masing-masing proses bahwa “eh gue dah selesai yak donload folder x , loe gue end :D”. Nah script tadi melakukan blocking sesuai jumlah channel yang ter-produce.
Dari end proses diatas menunjukkan bahwa pesan “Image downloaded /Users/indraoctama/Downloads/ponytail/ponytail_0151.png successfully!, count data /Users/indraoctama/Downloads/ponytail/ : 151 success” dikirim dari sub-proses iterateDownloadImages ke function main.
Kesimpulan
Kita telah sama-sama menyimak implementasi dan contoh penggunaan wait group, channel, go routine dengan cara yang mudah dipahami sebagai awalan. Bahwasanya artikel ini pastinya kurang dari kata sempurna, mungkin selanjutnya kita bisa lebih deep lagi dalam membaca pros dan cons wait group vs channel. Kapan pake salah satu dari tools tersebut dan sebagainya. Jika teman-teman ada komen boleh loh komen dibawah ini. Mari kita sama-sama belajar cheers :).