Goroutines & Go Runtime Scheduler: GMP Modeli
Go'nun 2 KB bellek ile milyonlarca mikro iş parçacığını yönetme sırrı: G, M, P.
Bir restoranda: G (Müşteri siparişi/Goroutine), M (Fiziksel aşçı/OS Thread), P (Aşçının çalıştığı tezgah/Processor bağlamı). Bir aşçı yemeğin kaynamasını beklerken diğer tezgahtaki siparişi çalar (Work Stealing).
Goroutine sadece ~2KB stack alanı ile başlar ve dinamik büyür. GMP Modeli: G = Goroutine, M = Machine (OS Thread), P = Processor (Mantıksal CPU bağlamı, GOMAXPROCS). Go Runtime boşta kalan P'lerin diğer P'lerin kuyruğundan iş çalmasını (Work Stealing) sağlayarak maksimum CPU verimi elde eder.
“Go scheduler işletim sistemi çekirdeğinde değil, kullanıcı alanında (User-space) çalışan işbirlikçi ve öncelikli (cooperative & preemptive) bir planlayıcıdır. Syscall veya kanal beklemesinde M bloke olursa P hemen başka bir M ile eşleşerek diğer goroutine'leri koşturmaya devam eder.”
func worker(id int, ch chan int) {
for n := range ch {
fmt.Printf("Worker %d: %d\n", id, n*2)
}
}
func main() {
ch := make(chan int, 100)
for i := 1; i <= 3; i++ { go worker(i, ch) } // 3 Goroutine
for j := 1; j <= 10; j++ { ch <- j }
close(ch)
}
Goroutine Leaks: Kapanmayan bir kanalı sonsuza dek bekleyen goroutine'lerin RAM tüketerek sunucuyu kilitlemesi.