Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
30 Dec 2022 · 3 mnt baca ·Artikel 99 / 119
Go

Pengenalan Go Routine Pada Golang

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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.

go
 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.

bash
 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 kabar

Tulisan “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.

go
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.

go
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) // tekno

Bisa 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.

Artikel Terkait

💬 Komentar