Goroutine yaşam döngüsü
- Go kursu
- Uzman
- Ders 2/34
- 4 dk
Goroutine'in çalışma, bekleme ve bitme durumlarını öğrenirsin.
Goroutine yaşam döngüsü
Bir goroutine şu durumlardan geçer: runnable (kuyrukta, çalışmayı bekliyor) → running (bir M+P üzerinde çalışıyor) → waiting (kanal, kilit, zamanlayıcı veya ağ bekliyor) → tekrar runnable → sonunda dead.
ch := make(chan int)
go func() { ch <- 1 }() // runnable → running
v := <-ch // main waiting, sonra runnableBekleyen goroutine P'yi bırakır; P hemen başka bir G çalıştırır.
Sızan goroutine
Hiç gelmeyecek bir olayı bekleyen goroutine sonsuza dek waiting kalır ve belleğini bırakmaz; buna goroutine sızıntısı denir. Tipik neden, sonucu okunmayan bir kanala yazmaktır:
func ilk(urls []string) string {
ch := make(chan string) // arabelleksiz!
for _, u := range urls {
go func() { ch <- getir(u) }()
}
return <-ch // diğerleri sonsuza dek bekler
}Çözüm: make(chan string, len(urls)) ya da context ile iptal.
Uygulama Sızıntısız ilk sonuç
ilk(n int) int yaz: n goroutine başlatsın, her biri kendi indeksini kanala göndersin, fonksiyon ilk geleni döndürsün. Kanalı n kapasiteyle oluşturarak sızıntıyı önle. ilk(3) >= 0 sonucunu yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
func ilk(n int) int {
ch := make(chan int, n)
for i := 0; i < n; i++ {
go func(i int) { ch <- i }(i)
}
return <-ch
}
func main() {
fmt.Println(ilk(3) >= 0)
}Beklenen çıktı
true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Kanalı okuyan biri olmadan <code>ch <- 1</code> gönderen goroutine hangi durumdadır?
- waiting (kanal bekliyor) Doğru cevap
- running
- dead
- runnable
Açıklama: Arabelleksiz kanalda gönderim, alıcı gelene kadar goroutine'i waiting durumuna sokar ve P'yi serbest bırakır.
2 Sızıntıyı önle
ch := make(chan string, ____)
ch := make(chan string, len(urls))
Açıklama: Her gönderici için yer olan arabellek, okunmayan sonuçlarda bile goroutine'lerin bitmesini sağlar.
3 Durum ve neden
| Kavram | Anlamı |
|---|---|
runnable |
Kuyrukta sıra bekliyor |
running |
P üzerinde çalışıyor |
waiting |
Kanal/kilit/ağ bekliyor |
dead |
Fonksiyon bitti |