Timeout e ticker
Utilizzare time.After e time.Tick con select
Timeout e ticker è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
Perché i timeout sono importanti
Senza timeout, una goroutine in attesa su un canale lento può bloccarsi per sempre. Il pacchetto time fornisce primitive per aggiungere un controllo basato sul tempo alle operazioni sui canali.
time.After per un timeout singolo
time.After(d) restituisce un canale che riceve un valore dopo la durata d. Lo usi in un caso di select per interrompere un'attesa.
select {
case res := <-ch:
fmt.Println(res)
case <-time.After(2 * time.Second):
fmt.Println("timed out")
}Timeout ripetuti con time.NewTimer
Per i timer riutilizzabili, usi time.NewTimer e chiami Reset dopo ogni utilizzo. Chiami Stop per evitare perdite del timer.
timer := time.NewTimer(5 * time.Second)
defer timer.Stop()
select {
case <-timer.C:
fmt.Println("timer fired")
}time.Tick rispetto a time.NewTicker
time.Tick è comodo, ma causa una perdita del ticker sottostante. Preferisca time.NewTicker, così può chiamare Stop() per liberare le risorse.
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
for range ticker.C {
fmt.Println("tick")
}Ticker in un ciclo
Combini un ticker con un canale done per eseguire periodicamente del lavoro e arrestarlo in modo ordinato.
ticker := time.NewTicker(time.Second)
done := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
doWork()
case <-done:
ticker.Stop()
return
}
}
}()Perdita di risorse con time.After
time.After crea un nuovo timer a ogni chiamata e il timer non può essere raccolto dal garbage collector finché non scatta. In un ciclo serrato, usi time.NewTimer + Reset per evitare una perdita di timer.
Deadline rispetto a timeout
Un timeout è una durata relativa ("attendi 5 s"). Una deadline è un momento assoluto ("attendi fino alle 14:00"). Usi time.Until(deadline) per convertire una deadline in una durata da utilizzare con time.After.
deadline := time.Now().Add(5 * time.Second)
select {
case v := <-ch:
use(v)
case <-time.After(time.Until(deadline)):
fmt.Println("deadline exceeded")
}È preferibile context.WithTimeout
Per gli handler HTTP e il lavoro strutturato, preferisca context.WithTimeout ai timeout basati su canali non elaborati: propaga automaticamente l'annullamento lungo lo stack delle chiamate.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()Limitazione della frequenza con Ticker
Un ticker è il limitatore di frequenza più semplice: invii una richiesta per ogni tick. Per supportare i burst, pre-riempia un canale con buffer e lo rifornisca con un ticker.
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)
}Orologio monotono
Le durate dei timer di Go usano l'orologio monotono, non l'orologio civile, quindi sono immuni alle modifiche dell'orologio di sistema. Anche time.Since e time.Until lo utilizzano.
Arrestare correttamente un ticker
Dopo ticker.Stop(), il canale del ticker NON viene chiuso: smette soltanto di ricevere valori. Se necessario, svuoti eventuali valori già presenti nel canale prima di restituire il controllo.
Verifica rapida
Perché si preferisce time.NewTicker a time.Tick?
Riepilogo: timeout e ticker
Punti chiave:
- time.After per un timeout singolo in select
- time.NewTicker per il lavoro ripetuto; chiami sempre Stop()
- Eviti time.After nei cicli: causa perdite di timer
- Preferisca context.WithTimeout per il lavoro annullabile
Impara Go con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «Timeout e ticker» è gratuita?
Sì — il testo completo di «Timeout e ticker» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «Timeout e ticker»?
Utilizzare time.After e time.Tick con select Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Timeout e ticker»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.