Nesse post vamos implementar uma função que utiliza context. No exemplo de chamada, vou utilizar o context WithTimeout
. Dessa forma, conseguiremos fazer a função ser cancelada automaticamente, caso o tempo de execução dela ultrapasse o tempo estipulado no context.
Vamos iniciar criando uma função com o nome doSomeHeavyWork
.
Para simular um processamento longo, vamos adicionar uma goroutine com um sleep de 2 segundos. Essa goroutine irá receber um channel do tipo bool. Ele irá sinalizar que a goroutine foi finalizada.
Na struct context.Context
, temos um método chamado Done()
. Esse método retorna um channel. Quando o context for finalizado, esse channel será fechado. Isso ocorrerá quando:
- WithCancel – quando a função cancel for executada;
- WithDeadline – quando a deadline expirar;
- WithTimeout – quando timeout for atingido.
Como temos um channel de controle para o sleep e outro do context, precisamos adicionar um select para capturar o channel que foi acionado primeiro.
Para testar nossa função, vamos criar um context com timeout de 1 segundo.
Ao executar o programa com um go run main.go
, teremos o seguinte resultado:
Alterando o tempo do nosso timeout para 3 segundos e, executando novamente o programa, o resultado será a mensagem de work completed!
.
Se você quiser saber um pouco mais sobre os tipos de context disponíveis e quando normalmente são utilizados, recomendo a leitura do nosso post “Onde e qual context utilizar”.
Espero ter ajudado e até uma próxima!
*O conteúdo deste artigo é de responsabilidade do(a) autor(a) e não reflete necessariamente a opinião do iMasters.