Channel - Select

Pada sesi ini akan di bahas penggunaan select pada Channel

select statement digunakan untuk melakukan pemilihan dan memanage multiple channel yang dibuat. select statement akan melakukan blocking sampai ada salah satu dari case yang berjalan.

package main

import (
	"fmt"
	"time"
)

func server1(ch chan string) {
	time.Sleep(5 * time.Second)
	ch <- "from server1"
}
func server2(ch chan string) {
	time.Sleep(3 * time.Second)
	ch <- "from server2"

}
func main() {
	output1 := make(chan string)
	output2 := make(chan string)
	go server1(output1)
	go server2(output2)
	select {
	case s1 := <-output1:
		fmt.Println(s1)
	case s2 := <-output2:
		fmt.Println(s2)
	}
}

Mari kita asumsikan bahwa kita memiliki aplikasi dan kita perlu mengembalikan output ke pengguna secepat mungkin. Database untuk aplikasi ini direplikasi dan disimpan di server yang berbeda di seluruh dunia. Asumsikan bahwa fungsi server1 dan server2 sebenarnya berkomunikasi dengan 2 server tersebut. Waktu respons setiap server bergantung pada beban masing-masing dan performa jaringan. Kita mengirim permintaan ke kedua server dan kemudian menunggu. Server yang merespons pertama akan dipilih dan respons lainnya diabaikan. Dengan cara ini kita dapat mengirim permintaan yang sama ke beberapa server dan mengembalikan respons tercepat ke pengguna.

Default Case

Statement default dari select dapat dimanfaatkan jika belum ada satupun case yang siap dijalankan. Ini berguna untuk menghindari blocking.

package main

import (
	"fmt"
	"time"
)

func process(ch chan string) {
	time.Sleep(3 * time.Second)
	ch <- "process successful"
}

func main() {
	ch := make(chan string)
	go process(ch)
	for {
		time.Sleep(1 * time.Second)
		select {
		case v := <-ch:
			fmt.Println("received value: ", v)
			return
		default:
			fmt.Println("no value received")
		}
	}
}

Kita lihat bahwa pada kode di atas terdapat fungsi process yang bertigas sebagai pengirim data melalui Channel. Namun proses pengiriman akan delay 3 detik, sehingga kita menambahkan default pada select untuk dijalankan terlebih dahulu sambil menunggu proses penerimaan data.

Last updated