"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo seleccionar un canal de envío con búfer y un canal de recepción sin búfer simultáneamente en Go?

¿Cómo seleccionar un canal de envío con búfer y un canal de recepción sin búfer simultáneamente en Go?

Publicado el 2024-11-06
Navegar:890

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

Seleccione en Go un canal de envío y recepción simultáneamente

En Go, es posible realizar operaciones de E/S sin bloqueo en canales utilizando la instrucción select. Sin embargo, surge una pregunta común cuando se trata de un canal de envío con buffer (chan

El problema al verificar la longitud/capacidad del canal

Un enfoque común es verificar la longitud o capacidad de los canales antes de enviar o recibir. Sin embargo, esto no es confiable porque el estado del canal puede cambiar entre la verificación y la operación posterior:

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

    r 

La solución: caso predeterminado con retraso de tiempo

Para resolver este problema, puede utilizar una instrucción de selección con un caso predeterminado que incluya un retraso de tiempo breve. Esto evita el uso excesivo de la CPU y le permite volver a intentar la operación si ambos canales no están listos:

s := make(chan

Al agregar el caso predeterminado, el programa solo se bloqueará por un corto período si ambos canales no están listos, lo que permitirá que los recursos de la CPU se liberen mientras espera que un canal esté disponible.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3