"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como implementar um bloqueio com prazo em Golang?

Como implementar um bloqueio com prazo em Golang?

Publicado em 2024-11-09
Navegar:830

How to Implement a Lock with a Deadline in Golang?

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:

l 

Para desbloquear, receba do canal:

Executando um Try Lock

Para tentar um try lock, use um select declaração:

select {
case l 

Este 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 l 

Este 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.

Tutorial mais recente Mais>

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