runtime.Gosched
- Go kursu
- Uzman
- Ders 21/34
- 4 dk
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
package main
import (
"fmt"
"runtime"
"sync/atomic"
)
func main() {
// buraya yaz
}Örnek çözüm
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
for !hazir.Load() {
runtime.____()
}
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 |