Teknik Elektro LinksThermostat, Panel Bel, Board Mikro, Driver Relay.

Nyobain Dikit Concurrency Dengan goroutines. Wow, Go Memang Keren!

Kemudahan dalam hal concurrency merupakan salah satu fitur unggulan yang ditawarkan oleh Go. Concurrency adalah kemampuan untuk menjalankan beberapa atau banyak pekerjaan secara bersamaan. Dengan kemampuan ini, maka unit-unit concurreny dapat diproses atau dieksekusi secara paralel. Untuk memudahkan concurrent programming, Go memiliki goroutines.

Goroutines adalah fungsi yang bekerja bersamaan (waktunya) dengan fungsi-fungsi lain. Goroutines adalah thread yang ringan. Dibandingkan dengan thread, kebutuhan memori untuk menciptakan goroutine jauh lebih sedikit. Sebuah aplikasi Go bisa memiliki ratusan hingga ribuan goroutines yang bekerja bersamaan.

Sebagai pemula Go, saya sangat bersemangat untuk mengetahui lebih banyak dan mencoba fitur-fitur yang dimiliki bahasa pemrograman Go. Meskipun masih banyak detil yang perlu saya pelajari, namun tak menyurutkan niat saya untuk berbagi sedikit hasil eksperimen saya dengan goroutines.

Berikut ini adalah listing program yang saya buat untuk mencoba goroutines.

// ****************************
// goroutine.go
// nyobain goroutines
// ****************************

package main

import ("fmt"; "time")

var eoa bool = false
var eob bool = false

func a() {
  for a := 1; a<=10; a++ {
    fmt.Println(" a() --->", a)
    time.Sleep(100 * time.Millisecond)
  }
  eoa = true
}

func b() {
  for b := 20; b<=30; b++ {
    fmt.Println(" b() --->", b)
    time.Sleep(200 * time.Millisecond)
  }
  eob = true
}

func main() {
  go a()
  go b()

  for !eoa || !eob {
    fmt.Println("main() ---> tunggu a() dan b() selesai.")
    time.Sleep(300 * time.Millisecond)
  }
  fmt.Println("Selesai.")
}

Dengan perintah $ go run goroutine.go, program dieksekusi dan menghasilkan tampilan sebagai berikut.

Fungsi a() menampilkan angka 1-10 dengan jeda (delay) 100ms. Fungsi ini akan mengupdate nilai variabel eoa menjadi true bila perulangan telah selesai dikerjakan.

Fungsi b() menampilkan angka 20-30 dengan delay 200ms. Fungsi ini akan mengupdate nilai variabel eob menjadi true bila perulangan telah selesai dikerjakan.

Fungsi main() menampilkan tulisan “main() —> … dst.” dengan delay 300ms. Fungsi main() menggunakan perulangan for untuk menunggu fungsi a() dan fungsi (b) selesai dieksekusi.

Untuk menjadikan fungsi a() menjadi goroutine, maka kita cukup menambahkan go di depan fungsi a(), sehingga menjadi go a().

Potongan program:

  a()
  b()

akan mengeksekusi (memanggil) fungsi a(). Dan setelah fungsi a() selesai, maka fungsi b() akan dieksekusi.

Dengan menambahkan go, sehingga menjadi:

  go a()
  go b()

maka fungsi a() dan b() akan menjadi goroutine dan akan dieksekusi secara bersamaan oleh mesin runtime Go. Mantap.

Sekarang mari kita perhatikan screenshot di atas. Fungsi a() dengan delay 100ms selesai duluan. Nampak juga terjadinya overlap tampilan yang menunjukkan bahwa memang benar bahwa fungsi-fungsi tersebut dieksekusi secara bersamaan (paralel).

Sampai disini, bolehlah kita diam sejenak untuk mengucapkan: Wow!

Selamat belajar.

Add a Comment

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