Kode program select multiple channel

Golang – Pengenalan dan cara menggunakan select channel

Kadang ada kasus dimana kita membuat beberapa channel, dan menjalankan beberapa goroutine untuk tiap channel nya, lalu kita ingin mendapatkan data dari channel tersebut, nah jika kita menggunakan perulangan for range maka akan ribet karena itu hanya bisa digunakan untuk satu channel.

Untuk melakukan hal tersebut kita bisa menggunakan select channel yang ada di golang, dengan menggunakan select channel kita bisa memilih data tercepat dari beberapa channel, jika data datang secara bersamaan maka akan diambil terlebih dahulu secara random salah satunya, lalu saat select selanjutnya barulah akan diambil data dari channel lainnya.

Kode program select multiple channel

Berikut contoh kode program untuk mengambil data dari multiple channel

package belajar_golang_goroutines

import (
	"fmt"
	"strconv"
	"testing"
	"time"
)

func GiveMeResponse(channel chan string) {
	time.Sleep(2 * time.Second)
	channel <- "Rendy Wijaya"
}

func TestSelectChannel(t *testing.T) {
	channel1 := make(chan string)
	channel2 := make(chan string)
	defer close(channel1)
	defer close(channel2)

	go GiveMeResponse(channel1)
	go GiveMeResponse(channel2)

	counter := 0
	for {
		select {
		case data := <-channel1:
			fmt.Println("Data dari Channel 1", data)
			counter++
		case data := <-channel2:
			fmt.Println("Data dari Channel 2", data)
			counter++
		}

		if counter == 2 {
			break
		}
	}
}
Kode program select multiple channel
Kode program select multiple channel

Perhatikan kode program diatas, kita akan menggunakan function yangsudah pernah dibuat sebelumnya yaitu GiveMeResponse untuk mengirim data ke channel. Dan seperti biasa kita juga membuat unit test yang kita beri nama TestSelectChannel pada unit test ini kita juga membuat dua channel channel1 & channel2 dan dilanjutkan dengan menjalankan dua goroutine untuk channel tersebut di baris 21 & 22.

Seletah menajalnkan goroutine kita akan membuat perulangan tanpa batas menggunakan for dan di dalam nya barulah kita menangkap atau mengambil data channel1 & channel2 dengan select, tidak lupa juga kita akan menghentikan perulangan jika semua data telah diambil. Coba jalankan program diatas

Output kode program select multiple channel
Output kode program select multiple channel

Bisa dilihat pada outputnya jika kita berhasil mengambil data dari kedua channel dan menampilkan nya ke layar.

Default select

Apa yang terjadi jika kita melakukan select pada channel yang tidak ada datanya, maka by default akan terjadi deadlock, maka kita akan menunggu sampai datanya ada tetapi jika tidak ada terus maka akan terjadi deadlock. Kadang kita ingin melakukan sesuatu saat datanya belum ada agar tidak terjadi error deadlock, dalam select kita bisa menambahkan default, dimana ini akan di eksekusi jika memang di semua channel yang kita melakukan select.

Kode program default

Untuk mencobanya silakan buat unit test baru seperti sebelumnya dengan kode program seperti berikut

func TestDefaultSelectChannel(t *testing.T) {
	channel1 := make(chan string)
	channel2 := make(chan string)
	defer close(channel1)
	defer close(channel2)

	go GiveMeResponse(channel1)
	go GiveMeResponse(channel2)

	counter := 0
	for {
		select {
		case data := <-channel1:
			fmt.Println("Data dari Channel 1", data)
			counter++
		case data := <-channel2:
			fmt.Println("Data dari Channel 2", data)
			counter++
		default:
			fmt.Println("Menunggu data")
		}

		if counter == 2 {
			break
		}
	}
}
Kode program default select multiple channel
Kode program default select multiple channel

Kode program diatas sebenarnya hampir sama dengan sebelumnya, hanya saja kita menambahkan default yang akan di eksekusi saat channel belum ada datanya, coba jalankan kode program diatas kembali dan lihat perbedaan outputnya

Output kode program select multiple channel
Output kode program select multiple channel

Pada output diatas bisa dilihat jika saat menunggu data di channel kita melakukan print "Menunggu data", dan bisa dilihat jika default nya dijalankan sangat banyak karena memang golang sangat cepat sekali.

Penutup

Pada artikel kali ini kita telah belajar tentang select channel pada bahasa pemrogaman go. Dan pada artikel selanjutnya saya akan membahas race condition & package sync pada bahasa pemrogaman go.

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar

About Me

About Me

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam.

Social Profiles

Facebook