CodeBlanks Logo Icon CodeBlanks

runtime.Gosched

Gosched ile goroutine'i gönüllü bırakmayı öğrenirsin.

runtime.Gosched

runtime.Gosched() mevcut goroutine'i bırakıp kuyruğa geri koyar; P başka bir goroutine'i çalıştırır, sonra sıra yine gelir. Goroutine bloklanmaz, yalnızca yol verir.

runtime.GOMAXPROCS(1)
go fmt.Println("goroutine")
runtime.Gosched()      // diğerine fırsat ver
fmt.Println("main")

Go 1.14'ten beri preemption olduğu için gerçek kodda nadiren gerekir; testlerde ve sıkı döngü deneylerinde görülür.

Senkronizasyon yerine kullanma

"Gosched çağırdım, goroutine çalışmış olmalı" varsayımı yanlıştır; zamanlayıcı bunu garanti etmez ve çok çekirdekli makinede davranış değişir. Bir işin bittiğini bilmek için kanal, sync.WaitGroup ya da sync.Once gibi gerçek senkronizasyon araçları kullanılır.

Uygulama Bayrağı bekle

var hazir atomic.Bool tanımla. Bir goroutine bayrağı true yapsın. main bayrak true olana kadar döngüde runtime.Gosched() çağırsın, sonra "hazır" yazdırsın.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "runtime"
    "sync/atomic"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "runtime"
    "sync/atomic"
)

func main() {
    var hazir atomic.Bool
    go hazir.Store(true)
    for !hazir.Load() {
        runtime.Gosched()
    }
    fmt.Println("hazır")
}

Beklenen çıktı

hazır

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Gosched ile time.Sleep(0) arasındaki temel fark nedir?

  • Aynı şeydir
  • Sleep(0) panic üretir
  • Gosched programı bitirir
  • Gosched hemen kuyruğa döner; Sleep zamanlayıcıya bağlanır Doğru cevap

Açıklama: Gosched yalnızca yol verir; senkronizasyon aracı değildir. Sıra garantisi için kanal veya WaitGroup kullanılır.

2 Yol ver

Soru
for !hazir.Load() {
    runtime.____()
}
Cevap
for !hazir.Load() {
    runtime.Gosched()
}

Açıklama: Gosched döngü beklerken P'yi diğer goroutine'lere bırakır.

3 Araç ve garanti

Kavram Anlamı
Gosched Yalnızca yol verir
Kanal Sıra garantisi
WaitGroup Bitişi bekler
atomic.Bool Güvenli bayrak

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