Kembali ke seri

Goroutine dan scheduler

Bagaimana Go menjadwalkan pekerjaan concurrent — dan kenapa Anda hampir tak perlu lagi mengatur GOMAXPROCS.

Daftar Isi

Kalau Anda cukup lama menulis Go, “tambahkan saja goroutine” jadi refleks. Memahami apa yang terjadi setelahnya adalah pembeda kode menengah dari pemula.

Modelnya dalam satu paragraf

Goroutine adalah task ringan yang di-switch melalui stack. Runtime memultiplexnya ke thread OS (M) lewat processor (P). Saat goroutine block di I/O, runtime memarkirnya dan memakai ulang thread-nya — tidak ada pemborosan thread-per-request.

Memulai pekerjaan

results := make(chan int, 3)

for i := 1; i <= 3; i++ {
    go func(n int) {
        results <- n * n
    }(i)
}

sum := 0
for i := 0; i < 3; i++ {
    sum += <-results
}

Kapan perlu peduli

  • Default GOMAXPROCS mengikuti jumlah core; override hanya dengan alasan terukur
  • Buffer terbatas (chan T, n) adalah alat backpressure Anda
  • Kalau Anda tak bisa menjelaskan siapa yang menutup sebuah channel, desain ulang

Bagian 2 melanjutkan dengan context dan pembatalan — separuh lain dari concurrency produksi.