-
Notifications
You must be signed in to change notification settings - Fork 0
Concurency pada golang
Yang berarti dia tidak berjalan secara paralel, tetapi kita dapat membuatnya terlihat seperti paralel dengan memanfaatkan goroutine.
Goroutine itu bukan sebuah thread, karna semua goroutine juga pada dasarnya berjalan pada single thread. tetapi mungkin mirip seperti thread? Perlu diingat juga bahwa sifat goroutine itu berjalan secara asynchronus, tetapi serah-terima (di sebuah channel) itu berjalan secara blocking/synchronus fungsi main di package main pada golang juga merupakan goroutine. Namun ia adalah main goroutine, yang berarti bahwa jika main goroutine sudah selesai dieksekusi, maka goroutine yang dispawn di dalam main goroutine tersebut tidak akan terkesekusi, oleh karena itu umumnya tutorial goroutine menggunakan kode blocking agar main goroutine tertahan dan goroutine yang di spawn tersebut dapat dieksekusi.
untuk contoh implementasinya bisa dilihat pada commit history ini
di channel juga terdapat opsi untuk menentukan jumlah data yang diterima, istilah itu disebut buffered channel. apa perbedaannya dengan channel biasa? jika channel biasa, goroutine akan selalu berjalan secara async tetapi pada buffered channel goroutine yang menerima data dari channel akan memblock/synchronus apabila channel sudah berisi lebih dari panjang dari buffer yang ditentukan. Tetapi untuk serah-terimanya tetap terjadi secara synchronus sama seperti channel biasa yang dijelaskan sebelumnya
untuk contoh buffered channel, bisa dilihat pada commit ini
kita juga dapat mengontrol sebuah channel menggunakan keyword select, ini mirip seperti konsep switch case, hanya saja diperuntukan khusus untuk channel, dengan keyword tersebut anda dapat mengontrol output dari berbagai channel dan mengarahkannya ketujuan yang ingin dituju
untuk contoh pengimplementasiannya, silahkan kunjungi commit ini
range and close
anda juga dapat membuat sebuah looping yang bergantung pada channel untuk mengeluarkan data dari channel tersebut. Dan sebagai pengirim, anda dapat menutup channel apabila sudah dipastikan tidak akan ada data lagi yang dikirim ke channnel tersebut.
untuk contoh pengimplementasiannya anda bisa lihat pada code commit history ini. Di situ terdapat hal yang unik. Yaitu channel direction, apa itu? singkatnya itu merupakan level akses channel pada golang yang ditentukan dengan keyword <-
untuk lebih jelasnya simak tabel berikut:
Sintaks | Penjelasan |
---|---|
ch chan string | Parameter ch bisa digunakan untuk mengirim dan menerima data |
ch chan<- string | Parameter ch hanya bisa digunakan untuk mengirim data |
ch <-chan string | Parameter ch hanya bisa digunakan untuk menerima data |
*contoh tabel tersebut dikutip dari website tutorial golang indonesia
di dalam select juga, kita dapat memanfaatkan sebuah kondisi timeout, dimana ada sebuah blok kondisi yang akan dieksekusi jika channel tersebut tidak menerima data dalam jumlah waktu yang ditentukan.
untuk melihat contoh implementasinya, silahkan lihat commit ini.
Anda juga dapat mensinkronisasi goroutine dengan menggunakan fungsi WaitGroup yang disediakan oleh package sync untuk informasi lebih lanjut silahkan kunjungi web tutorialnya langsung, kita juga dapat mengkombinasikan penggunaan channel dan waitgroup ini untuk memaksimalkan konsep concurrent
untuk contoh pengimplementasian sederhananya anda bisa kunjungi commit ini
Jangan ketuker ya antara mutex (mutual exclusion) dan mux itu berbeda 😂 mux itu multiplexer atau mungkin sederhananya itu konsep routing pada http (?)
nah sebelum bahas mutex kita perlu mengetahui sebuah istilah terlebih dulu. yaitu race condition, apa itu? itu adalah sebuah kondisi dimana dua buah goroutine mengakses/memodifikasi data yang sama secara bersamaan, yang menyebabkan data tersebut menjadi kacau, untuk mendeteksi adanya race condition pada program yang sedang berjalan, anda dapat menggunakan command go run -race nama_file.go
usecase race condition dapat anda lihat pada commit ini
untuk mengatasi masalah tersebut hadirlah mutex yang memberikan level akses pada data yang bungkus sehingga data tersebut hanya bisa di akses oleh 1 goroutine saja dan jika ada 2 goroutine yang mencoba mengaksesnya maka yang sisanya akan dipaksa menunggu sampai goroutine yang satu itu selesai, di mutex ada istilah lock dan unlock, ketika mengeksekusi instruksi yang berpotensi menimbulkan race condition sudah selesai tereksekusi umumnya akan dilakukan unlock untuk memperbolehkan goroutine lain mengakses scope tersebut.
untuk contoh implementasi dari mutex bisa dilihat di commit ini
note: mutex dapat di implemetasikan dengan berbagai cara/variasi tergantung usecase. contoh yang di commit hanya salah satunya saja