"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 selecionar um canal de envio com buffer e de recebimento sem buffer simultaneamente no Go?

Como selecionar um canal de envio com buffer e de recebimento sem buffer simultaneamente no Go?

Publicado em 2024-11-06
Navegar:954

How to Select on a Buffered Send and Unbuffered Receive Channel Simultaneously in Go?

Selecione em um canal Go de envio e recebimento simultaneamente

No Go, é possível realizar operações de E/S sem bloqueio em canais usando a instrução select. No entanto, surge uma questão comum ao lidar com um canal de envio com buffer (chan

O problema com a verificação do comprimento/capacidade do canal

Uma abordagem comum é verificar o comprimento ou a capacidade dos canais antes de enviar ou receber. No entanto, isso não é confiável porque o estado do canal pode mudar entre a verificação e a operação subsequente:

if len(r) > 0 {
    // Optionally execute other code

    r 

A solução: caso padrão com atraso de tempo

Para resolver esse problema, você pode usar uma instrução select com um caso padrão que inclui um pequeno atraso de tempo. Isso evita o uso excessivo da CPU e permite que você tente novamente a operação se ambos os canais não estiverem prontos:

s := make(chan

Ao adicionar o caso padrão, o programa só bloqueará por um curto período se ambos os canais não estiverem prontos, permitindo que os recursos da CPU sejam liberados enquanto espera que um canal fique disponível.

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