Komunikasi Antar Goroutine dengan Channel Pada Golang

Subscribe dengan Account Google untuk mendapatkan News Letter terbaru dari Halovina !
Komunikasi Antar Goroutine dengan Channel Pada Golang
ADVAN Laptop TBook Celeron N100

ADVAN Laptop TBook Celeron N100

SPESIFIKASI Advan Soulmate : Processor: Intel® Gemini Lake N4020, Graphics: Intel® Integrated Graphics, Memory: 4GB DDR4 (upgradable), Storage: 128GB (upgradable), Display: 14 inch HD 1366*768, Battery: 5000mAh 38wh, Connection: WiFi 802.11 b/g/n/ac + Bluetooth 4.2, Camera: 2.0 MP

Free Klik Disini !

Buat Anda sebagai software developer tentunya sudah sangat mengenal dengan istilah coroutine atau kalau di bahasa pemrogaraman golang dikenal dengan nama Goroutine.

Goroutine merupakan salah satu bagian penting dari concurent programming pada bahasa Go. Salah satu yang membuat Goroutine sangat istimewa adalah eksekusi yang dijalankan di multi core procesor.

Disini Anda bisa menentukan berapa banyak core yang aktif, makin banyak core akan makin cepat.

Goroutine mirip dengan thread, tapi sebenarnya bukan, sebuah native thread bisa berisikan banyak Goroutine.

Mungkin lebih pas kalau goroutine disebut sebagai mini thread. Goroutine sangat ringan, hanya dibutuhkan sekitar 2kB memori saja untuk satu buah goroutine.

Eksekusi goroutine bersifat asynchronous, menjadikannya tidak saling tunggu dengan goroutine lain.

A) Berkomunikasi antar Goroutine dengan Channel


Untuk meng-eksekusi perintah Goroutine selalu di awali dengan perintah "go".

goroutine and channel goroutine and channel

Channel digunakan untuk menghubungkan Goroutine satu dengan Goroutine lainya. Mekanisme yang dilakukan adalah serah terima data lewat channel tersebut.

Sebuah channel difungsikan sebagai sebuah pengirim di goroutine, dan juga sebagai penerima di goroutine lainya, pengiriman data pada channel bersifat synchronous.

B) Sample Code


Perhatikan contoh code berikut ini :

package main

import (
"fmt"
"sync"
)

type obj struct {
msg string
receiver int
}

func main() {
messages := make(chan *obj) // both block or non-block are ok
var wg sync.WaitGroup
receiver := 25 // specify receiver count

sender := func() {
o := &obj{
msg: "hello everyone!",
receiver: receiver,
}
messages <- o
}
recv := func(idx int) {
defer wg.Done()
o := <-messages
fmt.Printf("%d received at %d\n", idx, o.receiver)
o.receiver--
if o.receiver > 0 {
messages <- o // forward to others
} else {
fmt.Printf("last receiver: %d\n", idx)
}
}

go sender()
for i := 0; i < receiver; i++ {
wg.Add(1)
go recv(i)
}

wg.Wait()
}

variabel messages dideklarasikan bertipe channel struct. Cara pembuatan channel yaitu dengan menuliskan keyword make dengan isi keyword chan diikuti dengan tipe data channel yang diinginkan.

Demo :

Baca artikel lainya :


Sumber referensi : stackoverflow