time.Sleep în Go

Oprește goroutine-ul curent pentru durata dată (de exemplu 500*time.Millisecond), apoi continuă.

Sintaxă
func Sleep(d Duration)

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; scrie time.Sleep(time.Second).
  • Folosești Sleep ca să aștepți ca alte goroutine să termine („sper că 1 secundă ajunge”). Pe un calculator încărcat nu ajunge; folosește sync.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.