tutorial - lenguaje de programacion go pdf




Golang-Cómo saber que un canal con buffer está lleno (2)

¿Cómo saber que un canal en búfer está lleno? No sé ser bloqueado cuando el canal con buffer está lleno, en lugar de eso, elijo enviar el elemento enviado al canal con buffer.


En su lugar, elijo eliminar el elemento enviado al canal almacenado.

Eso se llama "canal desbordante", y se encuentra la respuesta de eapache/channels/overflowing_channel.go implementada en eapache/channels/overflowing_channel.go :

for elem := range ch.input {
    // if we can't write it immediately, drop it and move on
    select {
    case ch.output <- elem:
    default:
    }
}
close(ch.output)

Pero ese proyecto eapache/channels implementa otras estrategias también:

  • OverflowingChannel implementa la interfaz del Channel de una manera que nunca bloquea al escritor.
    Específicamente, si un valor se escribe en un OverflowingChannel cuando su búfer está lleno
    (o, en un caso sin búfer, cuando el destinatario no está listo), ese valor simplemente se descarta.

Para el comportamiento opuesto (descartar el elemento más antiguo, no el más nuevo) vea RingChannel .


Otro ejemplo útil con el que tropecé fue esta ingeniosa implementación de Ring Buffer .

La cita de la fuente:

La idea es simple: conecte dos canales con búfer a través de un Goroutine que reenvía los mensajes del canal entrante al canal saliente. Cuando no se pueda colocar un nuevo mensaje en el canal saliente, saque un mensaje del canal saliente (que es el mensaje más antiguo en el búfer), suéltelo y coloque el nuevo mensaje en el canal saliente recién liberado.

Echa un vistazo a esta versión C también ...