Go Academy · Lezione

Timeout e ticker

Utilizzare time.After e time.Tick con select

Lezione 2 di 413 passaggi

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
Gratis per iniziare

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.

Tutte le lezioni di questo corso

  1. L'istruzione select
  2. Timeout e ticker
  3. Modelli fan-in e fan-out
  4. Modello del worker pool
← Torna a Go Academy