Concurrency pada Golang-Part 1
Best Praktis Pengunaan Go Routine dan Channel
Pada penjelasan Best Praktis Basic Golang — Part 1 dan Best Praktis Basic Golang — Part 2 telah di paparkan bagaimana kita menggunakan soal-soal yang ada pada euler project untuk memahami logical pemograman dan perintah-perintah dasar Golang.
Pemograman pada dasarnya bukanlah hanya berfokus pada logical thinking tetapi ada beberapa hal lainnya yang perlu kita pelajari seperti input-output atau bagaimana concurrency diimplementasikan pada bahasa tersebut. Pada kesempatan ini kita akan membahas bagaimana implemetnasi concurrency pada Golang.
Pada pembahasan sebelumnya kita teleh membahas pengertian dari cuncurrency.
Concurrency adalah teknik pemrograman yang digunakan untuk menyelesaikan permasalahan dengan banyak request atau banyak prosess yang diselesaikan dalam waktu yang sama. Ciri utama dari proses concurrent adalah proses satu dengan proses yang lain tidak akan bisa dilakukan secara bersamaan pada suatu resource tertentu. Biasanya proses satu bergantian dengan proses lainnya. Dikarenakan sangat cepat jadi terkadang terlihat seperti dilakukan bersamaan.
Golang sudah mendukung cuncurrency secara defalut sehingga kita tidak membutuhkan library tambahan apapun. Konon golang di buat sebagi bahasa pemograman yang mengedepankan cuncurrency secara baik dan mudah.
Kenapa Kita Membutuhkan Concurrency
Apabila kita lihat kembali solusi-solusi yang kita buat pada semua penyelesaian semua soal-soal pada proyek euler kita hanya menyelesaikan dengan cara scyncromous dan menyelesaikannya tanpa penerapan concurrecy sehinga apabila data yang kita selesaikan cukup besar maka waktu pemrosesan semakin lama.
Berikut contoh sederhana perbandingan pemrosesan data tanpa dan menggunkan concurrecy.
func add(numbers []int) int64 {
var sum int64
for _, n := range numbers {
sum += int64(n)
}
return sum
}
Apabila kita eksekusi kode di atas baik untuk jumlah data yang sedikit ataupun banyak, kode tetap akan di jalankan pada singgle core prosesor sehingga kita masih dapat meningkatkan kecepatan pemrosesan dengan cara menjalankannya secara pararel.
Berikut adalah potongan code yang sudah kita terapkan concurrency.
func addWithConcurrency(numbers []int) int64 {
numberOfCores := runtime.NumCPU()
fmt.Println(numberOfCores)
runtime.GOMAXPROCS(numberOfCores)
var sum int64
max := len(numbers)
sizeOfPart := max / numberOfCores
var wg sync.WaitGroup
for i := 0; i < numberOfCores; i++ {
start := i * sizeOfPart
end := start + sizeOfPart
part := numbers[start:end]
wg.Add(1)
go func(nums []int) {
defer wg.Done()
var partSum int64
for _, n := range nums {
partSum += int64(n)
}
atomic.AddInt64(&sum, partSum)
}(part)
}
wg.Wait()
return sum
}
Berikut adalah semua code jika kita gabungkan.
Apabila kita eksekusi gabungan code di atas menghasilkan.
Penjumlahan tanpa concurrency,Jumlah : 7200343541469400, Waktu : 126.505691ms
Penjumlahan dengan concurrency,Jumlah : 7200343541469400, Waktu : 33.961067ms
Dari eksekusi code, jelas terlihat jika kita menerapkan concurrency waktu proses menjadi lebih cepat sampai kira-kira 4 kali. Apakah penggunaan concurrency semudah ini!!! Untuk dapat mengetahuinya lebih dalam mengenai concurrency pada Golang akan dilanjutkan pada pembahasan Concurrency pada Golang — Part 2.
References
- https://medium.com/the-legend/best-praktis-basic-golang-part-1-2cf8111a695d
- https://medium.com/the-legend/best-praktis-basic-golang-part-2-cbb8aec9c816
- https://medium.com/the-legend/golang-vs-java-concurrency-351ca5a845cb
Sponsor
Membutuhkan kaos dengan tema pemrograman :
Dapat menghubungi The Legend.