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.

Iklan

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google+

You are commenting using your Google+ account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

w

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.