Adquirindo bloqueios com restrições de tempo em Golang
Ao trabalhar com bloqueios em Golang, há situações em que você pode precisar adquirir um bloqueio imediatamente ou observar algum tipo de prazo. Embora o sync.Mutex da biblioteca padrão forneça apenas as funções Lock() e Unlock(), existe uma técnica que permite emular um bloqueio com um prazo.
Implementando um bloqueio com um prazo
Para criar um bloqueio com prazo, você pode usar um canal com tamanho de buffer igual a um:
l := make(chan struct{}, 1)
Para bloquear, envie um valor de estrutura para o canal:
lPara desbloquear, receba do canal:
Executando um Try Lock
Para tentar um try lock, use um select declaração:
select { case lEste código adquirirá imediatamente o bloqueio se estiver disponível. Se o bloqueio já estiver mantido, a instrução select será bloqueada até que o bloqueio seja liberado.
Try Lock with Timeout
Para especificar um tempo limite para o bloqueio try, adicione um canal time.After() para a instrução select:
select { case lEste código tentará adquirir o bloqueio por até um minuto. Se o tempo limite expirar, a instrução select será encerrada e o bloqueio não será adquirido.
Conclusão
Usando um canal com tamanho de buffer igual a um como mutex permite implementar um bloqueio de tentativa com um prazo. Essa técnica pode ser útil em cenários onde você precisa adquirir um bloqueio rapidamente ou dentro de um prazo específico.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3