Go Academy · Aula

WithCancel e WithTimeout

Crie contextos canceláveis e com limite de tempo

Aula 2 de 413 etapas

WithCancel e WithTimeout é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

context.WithCancel

WithCancel deriva um novo contexto com uma função de cancelamento. Chamar cancel fecha o canal Done do contexto derivado e de todos os seus filhos.

ctx, cancel := context.WithCancel(parent)
defer cancel() // always call to release resources
go doWork(ctx)

Use sempre defer cancel

Não chamar cancel causa o vazamento da goroutine que monitora o contexto pai. Use sempre defer cancel imediatamente após criar um contexto cancelável.

context.WithTimeout

WithTimeout deriva um contexto que é cancelado automaticamente após a duração informada. É um wrapper conveniente para WithDeadline.

ctx, cancel := context.WithTimeout(parent, 5*time.Second)
defer cancel()
if err := db.QueryContext(ctx, query); err != nil {
    // err may be context.DeadlineExceeded
}

Verificação de Err()

Depois que Done é fechado, ctx.Err() retorna o motivo: context.Canceled (cancelado explicitamente) ou context.DeadlineExceeded (tempo limite excedido).

if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
    log.Println("timeout")
}

Cancelamento a partir de outra goroutine

A função de cancelamento pode ser chamada com segurança de qualquer goroutine e simultaneamente de várias goroutines. Somente a primeira chamada tem efeito.

ctx, cancel := context.WithCancel(context.Background())
go func() {
    if detectError() { cancel() }
}()

Tempo limite da solicitação HTTP

Defina um tempo limite por solicitação com WithTimeout no contexto da solicitação recebida:

func handler(w http.ResponseWriter, r *http.Request) {
    ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
    defer cancel()
    result, err := service.Call(ctx)
    // ...
}

Cancelamento em cascata

Se um contexto pai for cancelado, todos os contextos derivados (filhos e netos) serão cancelados automaticamente, interrompendo todas as goroutines na árvore de chamadas.

Contexto nos testes

Use context.Background() ou context.WithTimeout nos testes para garantir que as goroutines iniciadas pelos testes tenham um limite de tempo.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
testResult := runTest(ctx)

Propagação do contexto pelas bibliotecas

Sempre passe às chamadas de saída o contexto recebido (consultas ao banco de dados, chamadas HTTP, RPCs). Nunca o descarte nem o substitua, a menos que tenha um motivo específico para redefinir o prazo.

Criação de um contexto para um trabalho em segundo plano

Para trabalhos em segundo plano que não estejam vinculados a uma solicitação, use context.Background() como raiz e adicione um WithCancel para que o trabalho possa ser interrompido corretamente.

select com Done

Sempre faça select em ctx.Done() juntamente com o canal de trabalho para evitar bloqueios quando o contexto for cancelado antes da conclusão do trabalho.

select {
case result := <-workCh:
    return result, nil
case <-ctx.Done():
    return nil, ctx.Err()
}

Verificação rápida

Qual é a diferença entre context.WithCancel e context.WithTimeout?

Recapitulação: WithCancel e WithTimeout

Pontos-chave:

  • Use sempre defer cancel() logo após a criação
  • WithTimeout cancela automaticamente após a duração; retorna DeadlineExceeded
  • ctx.Err() distingue Canceled de DeadlineExceeded
  • O cancelamento é propagado para todos os contextos derivados
Grátis para começar

Aprenda Go com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “WithCancel e WithTimeout” é grátis?

Sim — o texto completo de “WithCancel e WithTimeout” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “WithCancel e WithTimeout”?

Crie contextos canceláveis e com limite de tempo Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “WithCancel e WithTimeout”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Por que context.Context existe
  2. WithCancel e WithTimeout
  3. WithDeadline e WithValue
  4. Contexto em chamadas HTTP e de banco de dados
← Voltar para Go Academy