Go – Concurrency

Concurency atau threading adalah proses/pekerja yang menjalankan program atau kode. Contoh thread dalam dunia nyata yaitu katakan kita sedang membangun rumah dan orang yang bekerja sebagai pembangun rumahnya adalah thread / worker. Dan semakin banyak tukang yang ada maka perkerjaan membangun rumah akan cepat selesai.

Dan dengan berkembangnya processor saat ini yang lebih menekankan kepada banyaknya processor, multi thread programming sangatnya cocok untuk digunakan, karena nantinya setiap core pada processor dapat menghandle thread masing-masing. Namun pemrogramman multi thread ini tidaklah semudah yang kita analogikan tadi seperti adanya masalah tentang ketergantungan 1 thread dengan yang lain dan adanya resource / data yang diakses oleh beberapa thread secara bersamaan. Namun pada golang semua sudah dikemas dalam 1 kesatuan yang lebih mudah yaitu dengan goroutine dan channel.


Goroutines

Pada setiap program go yang berjalan akan memiliki minimal 1 goroutine yaitu thread dari fungsi main. Untuk dapat memulai goroutine baru kita cukup memanggil sebua fungsi dengan menambahkan kata go sebelum nama fungsinya.

Pada program diatas memiliki 2 goroutine, yaitu miliknya fungsi main dan goroutine yang kita buat yaitu pada pemanggilan fungsi go g(0). Jika normal tanpa menambahkan go, maka f(0) akan dijalankan di goroutine main, dalam artian program akan menunggu ekseskusi fungsi f(0) selesai baru akan mengeksekusi baris kode selanjutnya.

Dengan menggunakan goroutine, pemanggilan fungsi f(0) tidak perlu menunggu eksekusi selesai, setelah memanggil go f(0) maka go akan lansung mengeksekusi baris selanjutnya tanpa mengunggu eksekusi f(0) selesai. Kalau tidak ada fmt.Scanln maka f(0) tidak akan tereksekusi karena goroutine main sudah selesai maka program akan dianggap selesai dan goroutine yang untuk memanggil f(0) tadi juga akan selesai secara otomatis.

Goroutine ringan dijakalankan dan sangat mudah untuk dibuat di golang, inilah keunggulan dari golang dalam membuat worker. Kita dapat memanggil fungsi dengan go di depannya dengan sangat mudah.


Channel

Dengan channel ini komunikasi antar goroutine menjadi sangat mudah. Channel menyediakan feature untuk komunikasi dan sinkronasi antar goroutine.

Pada program diatas akan menghasilkan output ping secara terus menerus.  Berikut penjelasan pada kode diatas :

  • Line 23 : membuat channel bertipe string dan diinisialisasi dengan make
  • Line 25 : memanggil pinger pada goroutine baru dan meneruskan channel c sebagai parameter pada pinger.
  • Line 26 : memanggil printer pada goroutine baru.

Program diatas memiliki 3 goroutine yang bekerja bersamaan. Pada goroutine pinger, kita mengisi channel c “ping” yaitu dengan tanda <-. Dalam state ini, channel c sudah berisi data dan tidak dapat diisi lagi. Dalam hal ini goroutine pause dan menunggu sampai channel c kosong. Pada goroutine lainnya yaitu fungsi printer terdapat line yang menunggu yaitu pada line 16. (msg := <- c) yang artinya jika c memiliki isi maka isi dari c akan di masukkan ke variable msg dan c akan menjadi kosong. Dan akan menyebabkan goroutine pinger akan mengisinya lagi, dan akhirnya printer membacanya lagi, begitu secara terus menerus.


Select

Select bekerja seperti switch namun digunakan khusus untuk channel. Select digunakan untuk memilih dari baberapa channel manakah yang siap untuk diterima datanya.

Select pada line 26 terdapat 2 case yaitu case untuk c1 dan c2. Select akan mengeksekusi channel manakan yang siap untuk diproses. Jika terdapat 2 channel yang siap dalam waktu bersamaan maka select akan merandomnya. Pada program diatas c1 akan siap setiap 2 detik sekali dan c2 akan siap setiap 3 detik sekali.

One thought on “Go – Concurrency

Leave a Reply

Your email address will not be published. Required fields are marked *