Concorrência em Go

Go context: Cancellation and Timeouts

Stop work that takes too long or is no longer needed with context.WithTimeout and WithCancel.

  • Avançado
  • 3 min de leitura
  • 1 exemplo executável
O que você vai aprender
  • context.WithTimeout
  • ctx.Done()
  • context.WithCancel
Timeout of 50 ms
5 ms of worknil, finished in time
500 ms of workcontext deadline exceeded
after stop()context canceled

A cancellation signal passed down

A context carries a cancellation signal through your program. Functions that may take a long time accept a context and stop when it is cancelled or its deadline passes.

WithTimeout creates a context that is cancelled after 50 milliseconds. slowOperation waits for either its work or ctx.Done(), whichever comes first, and returns ctx.Err() when the context wins. WithCancel returns a function that cancels the context by hand.

Pontos-chave

  1. A context is cancelled by a deadline or by hand.
  2. ctx.Done() is a channel that closes on cancel.
  3. ctx.Err() says why.

Exemplo executável de Go

Go
Executar código →
main.go
package main

import (
	"context"
	"fmt"
	"time"
)

func slowOperation(ctx context.Context, duration time.Duration) error {
	select {
	case <-time.After(duration):
		return nil
	case <-ctx.Done():
		return ctx.Err()
	}
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
	defer cancel()

	fmt.Println("quick:", slowOperation(ctx, 5*time.Millisecond))
	fmt.Println("slow:", slowOperation(ctx, 500*time.Millisecond))

	manual, stop := context.WithCancel(context.Background())
	stop()
	fmt.Println("cancelled:", slowOperation(manual, time.Second))
}
Gerar um botão Run para este exemplo Resultado da execução
quick: <nil>
slow: context deadline exceeded
cancelled: context canceled

Pratique

Abra o exemplo no compilador online, mude um valor ou adicione uma linha e tente prever a saída antes de executar. Depois quebre o código de propósito e leia a mensagem do compilador.

Terminou esta lição?

Marque como aprendida para acompanhar seu progresso.

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios