Zaman Aşımları ve Zamanlayıcılar
select ile time.After ve time.Tick kullanma
Zaman Aşımları ve Zamanlayıcılar, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.
Zaman Aşımları Neden Önemlidir?
Zaman aşımı olmadan, yavaş bir kanalı bekleyen eşzamanlı bir rutin sonsuza dek engellenebilir. time paketi, kanal işlemlerine zamana dayalı denetim eklemek için temel araçlar sağlar.
Tek Kullanımlık Zaman Aşımı İçin time.After
time.After(d), d süresi geçtikten sonra bir değer alan kanal döndürür. Beklemeyi sonlandırmak için bunu bir seçim durumu içinde kullanın.
select {
case res := <-ch:
fmt.Println(res)
case <-time.After(2 * time.Second):
fmt.Println("timed out")
}time.NewTimer ile Tekrarlanan Zaman Aşımları
Yeniden kullanılabilir zamanlayıcılar için time.NewTimer kullanın ve her kullanımdan sonra Reset çağırın. Zamanlayıcı eşzamanlı rutininin sızmasını önlemek için Stop çağırın.
timer := time.NewTimer(5 * time.Second)
defer timer.Stop()
select {
case <-timer.C:
fmt.Println("timer fired")
}time.Tick ve time.NewTicker Karşılaştırması
time.Tick kullanışlıdır ancak temelindeki periyodik zamanlayıcıyı sızdırır; kaynakları serbest bırakmak için Stop() çağırabileceğiniz time.NewTicker kullanımını tercih edin.
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
for range ticker.C {
fmt.Println("tick")
}Döngüde Periyodik Zamanlayıcı
Temiz biçimde duran periyodik işler yürütmek için bir periyodik zamanlayıcıyı tamamlanma kanalıyla birleştirin.
ticker := time.NewTicker(time.Second)
done := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
doWork()
case <-done:
ticker.Stop()
return
}
}
}()time.After Sızıntısı
time.After her çağrıda yeni bir zamanlayıcı oluşturur ve zamanlayıcı, tetiklenene kadar çöp toplayıcı tarafından toplanamaz. Sık yinelenen bir döngüde zamanlayıcı sızıntısını önlemek için time.NewTimer + Reset kullanın.
Son Tarih ve Zaman Aşımı
Zaman aşımı göreli bir süredir ("5 saniye bekleyin"). Son tarih mutlak bir zamandır ("14:00'e kadar bekleyin"). Bir son tarihi, time.After için süreye dönüştürmek üzere time.Until(deadline) kullanın.
deadline := time.Now().Add(5 * time.Second)
select {
case v := <-ch:
use(v)
case <-time.After(time.Until(deadline)):
fmt.Println("deadline exceeded")
}context.WithTimeout Tercih Edilir
HTTP işleyicileri ve yapılandırılmış işler için ham kanal zaman aşımları yerine context.WithTimeout kullanmayı tercih edin; bu, iptali çağrı yığını boyunca otomatik olarak iletir.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()Periyodik Zamanlayıcıyla Hız Sınırlama
Periyodik zamanlayıcı, en basit hız sınırlayıcıdır: her tikte bir istek gönderin. Ani istek artışlarını desteklemek için arabellekli bir kanalı önceden doldurun ve kanalı periyodik zamanlayıcıyla yeniden doldurun.
requests := make(chan int, 5)
for i := 0; i < 5; i++ { requests <- i }
close(requests)
limiter := time.NewTicker(200 * time.Millisecond)
for req := range requests {
<-limiter.C
fmt.Println("request", req)
}Monotonik Saat
Go zamanlayıcı süreleri duvar saatini değil, monotonik saati kullanır; bu nedenle sistem saati ayarlamalarından etkilenmez. time.Since ve time.Until da bunu kullanır.
Periyodik Zamanlayıcıyı Doğru Durdurma
ticker.Stop() çağrısından sonra periyodik zamanlayıcı kanalı NOT kapatılır; yalnızca değer almaya son verir. Gerekirse dönmeden önce kanaldaki bekleyen değeri boşaltın.
Hızlı Kontrol
time.Tick yerine neden time.NewTicker tercih edilir?
Özet: Zaman Aşımları ve Periyodik Zamanlayıcılar
Temel noktalar:
- Seçim ifadesinde tek kullanımlık zaman aşımı için time.After
- Tekrarlanan işler için time.NewTicker; her zaman Stop() çağırın
- Döngülerde time.After kullanmaktan kaçının; zamanlayıcı sızıntısına neden olur
- İptal edilebilir işler için context.WithTimeout kullanmayı tercih edin
Yapay zeka eğitmeniyle Go öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 51
- Dersler
- 203
Sıkça Sorulan Sorular
“Zaman Aşımları ve Zamanlayıcılar” dersi ücretsiz mi?
Evet — “Zaman Aşımları ve Zamanlayıcılar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.
“Zaman Aşımları ve Zamanlayıcılar” dersinde ne öğreneceğim?
select ile time.After ve time.Tick kullanma Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Go Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Zaman Aşımları ve Zamanlayıcılar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- select Deyimi
- Zaman Aşımları ve Zamanlayıcılar
- Fan-in ve Fan-out Örüntüleri
- İşçi Havuzu Örüntüsü