Menggunakan goroutine dalam Go untuk menjalankan tugas konkuren

Addhe Warman
3 min readOct 31, 2023

--

GoRoutine

Goroutine adalah salah satu fitur utama dalam bahasa pemrograman Go yang memungkinkan kita menjalankan tugas konkuren dengan mudah. Goroutine adalah fungsi yang berjalan secara konkuren di dalam sebuah program Go dan dijadwalkan oleh runtime Go. Dengan menggunakan goroutine, kita dapat menjalankan tugas-tugas secara paralel, meningkatkan kinerja, dan meningkatkan efisiensi aplikasi.

Berikut adalah contoh sederhana penggunaan goroutine dalam Go:

package main
import (
"fmt"
"time"
)
func foo() {
for i := 0; i < 5; i++ {
fmt.Println("Foo:", i)
time.Sleep(100 * time.Millisecond)
}
}
func bar() {
for i := 0; i < 5; i++ {
fmt.Println("Bar:", i)
time.Sleep(200 * time.Millisecond)
}
}
func main() {
go foo() // Memulai goroutine untuk fungsi foo
go bar() // Memulai goroutine untuk fungsi bar
// Tunggu sebentar agar goroutine selesai menjalankan
time.Sleep(1 * time.Second)
fmt.Println("Selesai")
}

Dalam contoh di atas, kita mendefinisikan dua fungsi, `foo` dan `bar`, yang masing-masing mencetak pesan ke layar dan tidur untuk jangka waktu tertentu. Kemudian, kita menggunakan kata kunci `go` untuk memulai goroutine untuk masing-masing fungsi. Setelah itu, kita menunggu sebentar dengan `time.Sleep` di dalam `main` untuk memastikan bahwa goroutine selesai menjalankan sebelum program berakhir.

Hasilnya akan mencetak pesan-pesan dari `foo` dan `bar` secara konkuren, dan kita dapat melihat bahwa mereka berjalan secara bersamaan. Kita dapat menjalankan dan menguji contoh di atas di lingkungan Go kita sendiri untuk melihat hasilnya.

Penting untuk diingat bahwa penggunaan goroutine harus hati-hati karena dapat menghasilkan (race condition) jika tidak diatur dengan benar. Go memiliki berbagai cara untuk berkomunikasi antara goroutine, seperti `channel`, untuk menghindari masalah tersebut.

Channel adalah mekanisme komunikasi yang memungkinkan goroutine untuk bertukar data. Channel memiliki tipe data tertentu yang menentukan jenis data apa yang dapat dikirim dan diterima melalui channel tersebut. Channel dapat digunakan untuk mengirimkan dan menerima data secara sinkron atau asinkron, tergantung pada apakah channel tersebut memiliki buffer atau tidak. Channel juga dapat digunakan untuk mengirimkan notifikasi, mengontrol konkurensi, dan mengimplementasikan pola desain seperti future, promise, dan worker pool.

Berikut adalah contoh kode golang yang menunjukkan bagaimana channel bekerja:

// membuat channel bertipe string
ch := make(chan string)

// membuat goroutine yang mengirim data ke channel
go func() {
ch <- "Hello" // mengirim "Hello" ke channel
}()

// membuat goroutine lain yang menerima data dari channel
go func() {
msg := <- ch // menerima data dari channel dan menyimpannya di variabel msg
fmt.Println(msg) // mencetak data yang diterima
}()

// menunggu kedua goroutine selesai
time.Sleep(time.Second)

Output:

Hello

Penjelasan:

  • Pada baris pertama, kita membuat channel bertipe string dengan menggunakan fungsi make. Channel ini dapat digunakan untuk mengirim dan menerima data bertipe string.
  • Pada baris ketiga, kita membuat goroutine anonim dengan menggunakan kata kunci go. Goroutine ini akan mengirim data "Hello" ke channel ch dengan menggunakan operator <-.
  • Pada baris kedelapan, kita membuat goroutine anonim lain dengan menggunakan kata kunci go. Goroutine ini akan menerima data dari channel ch dengan menggunakan operator <- dan menyimpannya di variabel msg. Kemudian, goroutine ini akan mencetak data yang diterima ke layar.
  • Pada baris ketigabelas, kita menunggu kedua goroutine selesai dengan menggunakan fungsi time.Sleep. Fungsi ini akan menunda eksekusi program selama satu detik. Tanpa fungsi ini, program akan berakhir sebelum goroutine selesai dan output tidak akan terlihat.

--

--

Addhe Warman

My Nickname “Awan” taken from Name [A]ddhe [Wa]rma [n] it’s Cloud. Working in Cloud Environment GCP + AWS in Large Scale.