Go Language Chanel - Penghubung Antar Goroutine | Butuh Script

BUTUH SCRIPT

Go Language Chanel - Penghubung Antar Goroutine

Chanel adalah sebuah fasilitas yang tersedia pada GO lang yang berfungsi sebagai penghubung antar goroutine yang dibuat dengan menggunakan keyword  make  dan  chan  . Mekanisme pengiriman chanel adalah dengan mengirim dan menerima data melalui chanel tersebut.



Perlu digaris bawahi, Goroutine pengirim dan penerima harus berada pada chanel yang berbeda atau disebut buffered chanel. Pengiriman dan peneriman pada chanel ini bersifat blocking atau Synchronous. Ilustrasinya kurang lebih seperti berikut 

Penerapan Chanel

Dalam penerapannya, chanel merupakan sebuah variabel yang dibuat dengan menggunakan keyword  make  dan  chan . Variabel channel disini memiliki peran sebagai pengirim dan penerima data. 

Langsung saja, berikut adalah contoh program yang menggunakan chanel. 3 buah goroutine akan dieksekusi dengan proses pengiriman data melalui chanel. Data tersebut akan diterima 3 kali pada goroutine utama (  main  ). 

[code] package main

import "fmt"
import "runtime"

func main()  {
  runtime.GOMAXPROCS(2)

  var pesan = make(chan string)

  var sayHelloTo = func(who string)  {
    var data = fmt.Sprintf("hello %s", who)
    pesan <- data
  }

  go sayHelloTo("Chelud Wikanti Via")
  go sayHelloTo("Chalid Ade Rahman")
  go sayHelloTo("Chindy Via Roshita")

  var message1 = <- pesan
  fmt.Println(message1)

  var message2 = <- pesan
  fmt.Println(message2)

  var message3 = <- pesan
  fmt.Println(message3)
}
[/code]


Pada listing program diatas, variabel  message  dideklarasikan bertipe  chanel string . Pembuatan chanel yaitu dengan menuliskan keyword  make  dengan isi keyword  chan  diikuti dengan tipe data chanel yang diinginkan. Dalam listing program diatas dapat kita lihat pada sintaks berikut

var pesan = make(chan string)

Variabel  pesan  pada kode diatas akan menampung sebuah inputan string dengan isi "hello" yang disiapkan oleh sebuah closure dengan nama sayHelloTo. Tanda  <-  yang dituliskan di sebelah kiri nama variabel, menunjukan terjadi proses pengiriman data dari variabel yang berada di kanan menuju variabel yang berada pada sebelah kiri. Perhatikan baris berikut :


  var sayHelloTo = func(who string)  {
    var data = fmt.Sprintf("hello %s", who)
    pesan <- data
  }

Pada listing program diatas juga, Fungsi  sayHelloTo  dieksekusi sebanyak tiga kali sebagai goroutine berbeda. Menjadikan program ini berjalan secara asynnchronous atau tidak beraturan dan tidak saling tunggu. Dapat kita lihat pada baris berikut :


  go sayHelloTo("Chelud Wikanti Via")
  go sayHelloTo("Chalid Ade Rahman")


  go sayHelloTo("Chindy Via Roshita")

Seperti yang kita ketahui, perintah  go  menandakan perintah tersebut dijalankan sebagai goroutine. Dari ketiga fungsi tersebut, goroutine paling awal akan mengirim data dan diterimadatanya oleh variabel  message1 . Tanda  <-  menunjukan bahwa data dari sebelah kanan dikirim menuju variabel sebelah kiri dan disimpan. 

var message1 = <- pesan

fmt.Println(message1)

Penerimaan ini bersifat blocking, sehingga statement  var message1 = <- pesan  berarti data tidak akan diesekusi sebelum data dikirim lewat chanel. Ketiga goroutine tersebut akan menerima data secara berurutan oleh  message1 , message2  , message3  kemudian ditampilkan kurang lebih seperti berikut. 



Dari hasil output diatas, dapat Anda lihat bahwa eksekusi program tidak menghasilkan output yang sama. Hal ini dikarenakan, meski penerimaan data pada fungsi  sayHelloto  berurutan. Proses pengiriman data dari ketiga goroutine tersebut berbeda. Kita tidak tahu mana yang dieksekusi terlebih dahulu. Goroutine yang dieksekusi lebih awal, datanya akan diterima dan dimunculkan lebih awal. 

Namun dengan menggunakan chanel, proses blocking tidak perlu lagi menggunkaan  fmt.scanf(). seperti yang kita pelajari sebelumnya tentang goroutine. Chanel bersifat blocking sehingga dapat digunakan untuk mengantisipasi jika ada goroutine utama selesai lebih dahulu.   

Download Source File

Posting Komentar