timeout ile select
- Go kursu
- Orta seviye
- Ders 16/80
- 4 dk
time.After ile select içinde timeout kullanmayı öğrenirsin.
timeout ile select
time.After ile select'e zaman aşımı eklersin. Belirli süre içinde hiçbir case hazır olmazsa timeout case'i çalışır. Bu, sonsuz bekleme riskini ortadan kaldırır.
Kalıp: case <-time.After(2 * time.Second):. Bu, 2 saniye sonra sinyal gönderen bir channel döndürür. select onu bekler; süre dolunca timeout case'i çalışır ve goroutine çıkar veya başka iş yapar.
Timeout deseni
Timeout deseni production'da kritiktir: bir servise istek gönderirken yanıt belirli sürede gelmezse vazgeçersin. Bu, sistemi bloklanmış goroutine'lerle doldurmamayı sağlar.
context.WithTimeout daha temiz bir alternatif sağlar; timeout'u context olarak taşır ve iptal sinyali de verir. İleri düzey derslerde context detaylı işlenir.
Uygulama Timeout ile bekle
main içine bir select { case ... case <-time.After(...): ... } bloğu ve fmt.Println ile zaman aşımı yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
func main() {
ch := make(chan string)
select {
case m := <-ch:
fmt.Println(m)
default:
fmt.Println("zaman aşımı")
}
}Beklenen çıktı
zaman aşımı
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 time.After ne döndürür?
- Bir süre
- Bir goroutine
- Bir hata
- Bir channel Doğru cevap
Açıklama: bir channel. Süre time.Duration türündedir, time.After channel döndürür.
2 Timeout case
select {
case v := <-ch:
fmt.Println(v)
case <-time.After(____):
fmt.Println("zaman aşımı")
}
select {
case v := <-ch:
fmt.Println(v)
case <-time.After(2 * time.Second):
fmt.Println("zaman aşımı")
}
Açıklama: 2 sayı, time süre türüdür.
3 Timeout kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
time.After |
Zaman aşımı |
select |
Bekleme |
channel |
Sinyal |
default |
Non-blocking |