Pengenalan Go Routine Pada Golang
Penggunaan go-routine saat proses yang akan dieksekusi sebagai goroutine harus dibungkus kedalam fungsi. Pada saat pemanggilan fungsi tersebut ditambahkan di depannya dengan perintah go. Dengan demikian proses tersebut akan dideteksi sebagai goroutine baru.
Berikut ini contoh sederhana dari penerapan goroutine yang sederhana. Program ini menampilkan 10 baris teks, yang mana 5 baris dicetak menggunakan fungsi biasa dan 5 lainnya dicetak menggunakan goroutine baru.
1package main
2
3import (
4 "fmt"
5 "runtime"
6)
7
8func print(till int, message string) {
9 for i := 0; i < till; i++ {
10 fmt.Println((i + 1), message)
11 }
12}
13func main() {
14 runtime.GOMAXPROCS(2)
15 go print(5, "halo")
16 print(5, "apa kabar")
17 var input string
18 fmt.Scanln(&input)
19}Pada kode di atas, runtime.GOMAXPROCS(2) digunakan untuk menentukan jumlah prosesor yang aktif.
Pembuatan goroutine baru ditandai dengan go. Contoh pada perintah go print(5, "halo"), pada fungsi print() dieksekusi sebagai goroutine baru. Fungsi fmt.Scanln() digunakan agar proses jalannya applikasi berhenti di baris tersebut blockig hingga user menekan tombol enter.
Hal ini diperlukan karena ada kemungkinan proses goroutine print() dieksekusi lebih lama dibandingkan waktu selesainya goroutine utama main(), mengingat proses keduanya tersebut dijalankan secara asynchronous. Jika kita tidak menggunakan perintah tersebut maka, goroutine yang belum selesai secara paksa dihentikan prosesnya karena goroutine utama sudah selesai dijalankan.
1➜ sederhana git:(main) ✗ go run main.go
21 apa kabar
32 apa kabar
43 apa kabar
54 apa kabar
65 apa kabar
71 halo
82 halo
93 halo
104 halo
115 halo
12
13➜ sederhana git:(main) ✗ go run main.go
141 halo
152 halo
163 halo
174 halo
185 halo
191 apa kabar
202 apa kabar
213 apa kabar
224 apa kabar
235 apa kabarTulisan “halo” dan “apa kabar” bermunculan selang-seling disebabkan karena statement print(5,"halo") dijalankan dengan goroutine baru, menjadikan tidak saling tunggu dengan perintah `print(5,“apa kabar”).
Pada hasil dijalankan 2 kali program diatas. Hasil eksekusi pertama berbeda dengan yang kedua dikarenakan kita menggunakan 2 prosesor. Goroutine mana yang akan dieksekusi terlebih dahulu tergantung kedua prosesor tersebut.
Penggunaan Fungsi runtime.GOMAXPROCS()
Fungsi ini digunakan untuk menentukan jumlah prosesor yang digunakan dalam eksekusi program.
Jumlah prosesor yang diinputkan secara otomatis akan disesuaikan dengan jumlah asli logical processor yang ada pada server atau komputer. Jika angka yg diinputkan adalah lebih, maka dianggap menggunakan semua prosesor yang ada.
Penggunaan Fungsi fmt.Scanln()
Fungsi ini akan meng-capture semua karakter sebelum user menekan tombol enter, lalu menyimpannya pada variabel.
1func Scanln(a ...interface{}) (n int, err error)Fungsi diatas merupakan skema dari fungsi fmt.Scanln(). Fungsi tersebut bisa menampung parameter bertipe interface{} dengan jumlah tak terbatas. Tiap parameter akan ditampung di dalam variabel yang dipisah dengan tanda spasi. Agar lebih jelas, silahkan perhatikan contoh dibawah ini.
1var s1, s2, s3 string
2fmt.Scanln(&s1, &s2, &s3)
3
4// user inputs: "ihsan san tekno"
5
6fmt.Println(s1) // ihsan
7fmt.Println(s2) // san
8fmt.Println(s3) // teknoBisa dilihat pada kode di atas, untuk menampung parameter ihsan san tekno kita membutuhkan 3 buah variabel. Juga perlu diperhatikan bahwa yang disisipkan sebagai parameter pada pemanggilan fungsi fmt.Scanln() adalah referensi variabel, bukan nilai aslinya.