CodeBlanks Logo Icon CodeBlanks

Goroutine yaşam döngüsü

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 runnable

Bekleyen 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

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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 &lt;- 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

Soru
ch := make(chan string, ____)
Cevap
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

Uzman bölümündeki tüm dersler