Ce face time.Sleep
time.Sleep(d) pune pe pauză doar goroutine-ul care o apelează; restul programului (alte goroutine) merge mai departe. O durată zero sau negativă se întoarce imediat.
Se folosește pentru pauze între încercări (retry), pentru a nu bombarda un server sau în exemple și teste. Nu o folosi pentru a „aștepta” alte goroutine: pentru asta există sync.WaitGroup, canalele și context. O pauză nu poate fi întreruptă; dacă trebuie să poți anula așteptarea, folosește select cu time.After și ctx.Done().
Parametri
| Parametru | Descriere |
|---|---|
d |
Cât să aștepte (time.Duration), de exemplu 2 * time.Second. |
Ce returnează
Nimic.
Exemple
Exemplul 1: Numărătoare inversă
package main
import (
"fmt"
"time"
)
func main() {
for i := 3; i > 0; i-- {
fmt.Println(i, "...")
time.Sleep(200 * time.Millisecond)
}
fmt.Println("Start!")
}
Rezultat
3 ...
2 ...
1 ...
Start!
Exemplul 2: Reîncercare cu pauză tot mai mare
Un serviciu simulat reușește abia la a treia încercare. Pauza se dublează la fiecare eșec (backoff).
package main
import (
"errors"
"fmt"
"time"
)
var apeluri int
func trimiteSMS() error {
apeluri++
if apeluri < 3 {
return errors.New("serviciu indisponibil")
}
return nil
}
func main() {
pauza := 50 * time.Millisecond
for incercare := 1; incercare <= 5; incercare++ {
err := trimiteSMS()
if err == nil {
fmt.Println("Trimis la încercarea", incercare)
return
}
fmt.Printf("Încercarea %d: %v, aștept %v\n", incercare, err, pauza)
time.Sleep(pauza)
pauza *= 2
}
fmt.Println("Renunț")
}
Rezultat
Încercarea 1: serviciu indisponibil, aștept 50ms
Încercarea 2: serviciu indisponibil, aștept 100ms
Trimis la încercarea 3
Greșeli frecvente
- Scrii
time.Sleep(1000)crezând că sunt milisecunde. Sunt nanosecunde; scrietime.Sleep(time.Second). - Folosești
Sleepca să aștepți ca alte goroutine să termine („sper că 1 secundă ajunge”). Pe un calculator încărcat nu ajunge; foloseștesync.WaitGroup.
Comenzi înrudite
time.After: Returnează un canal care primește ora curentă după durata dată; folosit în select pentru limite de timp (timeout).time.Duration: Tipul pentru o durată, păstrată în nanosecunde; se scrie ca 90*time.Minute și se afișează ca „1h30m0s”.sync.WaitGroup: Așteaptă ca un grup de goroutine să termine: Add mărește contorul, Done îl scade, Wait blochează până ajunge la zero.context.WithTimeout: Creează un context care se anulează singur după durata dată; limita de timp standard pentru cereri și interogări.