Selección simultánea de canal de envío con búfer y recepción sin búfer
En Go, los canales proporcionan un mecanismo para la comunicación simultánea entre gorutinas. Esta pregunta explora cómo seleccionar simultáneamente en un canal de envío con búfer y un canal de recepción sin búfer, lo que permite que las gorutinas envíen o reciban datos según la disponibilidad del canal.
Seleccionar en un canal de envío con búfer
Para seleccionar un canal de envío almacenado en búfer, como s, donde los datos se pueden poner en cola antes de recibirlos, puede usar la siguiente sintaxis:
case s <- v: // Send value `v` to channel `s`
Sin embargo, con canales almacenados en buffer, el valor a enviar debe evaluarse con anticipación, lo que podría provocar que se envíen datos obsoletos debido a condiciones de carrera.
Seleccionar en un canal de recepción sin búfer
Seleccionar en un canal de recepción sin búfer, como r, donde los datos no están en cola, es sencillo:
case r := <-r: // Receive value `r` from channel `r`
De forma predeterminada, la selección en un canal de recepción se bloquea hasta que los datos estén disponibles.
Selección simultánea
Para seleccionar simultáneamente tanto en el canal de envío s almacenado en búfer como en el canal de recepción r sin búfer, puede utilizar la siguiente instrucción de selección:
select { case s <- v: fmt.Println("Sent value:", v) case vr := <-r: fmt.Println("Received:", vr) default: // No channels are ready, do something else, e.g. sleep }
Manejo de datos obsoletos
Al evaluar el valor a enviar usando v := valueToSend() fuera de la instrucción select, es posible que el canal s se llene o el canal r recibe datos antes de enviar el valor. Para evitar datos obsoletos, se puede agregar un caso predeterminado a la declaración de selección. Este caso predeterminado se ejecutará si ningún canal está listo y se puede utilizar para realizar una suspensión breve, dándole tiempo al canal para alcanzar un estado listo.
Evitar comprobaciones directas de la longitud del canal
Es importante tener en cuenta que verificar la longitud o capacidad de un canal y luego enviar o recibir no es confiable. El estado del canal puede cambiar entre el momento de la verificación y el envío/recepción, lo que provoca un comportamiento de bloqueo inesperado.
Conclusión
Al usar una declaración de selección con un caso predeterminado, las gorutinas Puede seleccionar simultáneamente un canal de envío con búfer y un canal de recepción sin búfer, optimizando el uso del canal y la eficiencia de los recursos. Sin embargo, es crucial considerar la posibilidad de que haya datos desactualizados y evitar verificaciones directas de la longitud del canal para garantizar una comunicación confiable.
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