Sobes.tech
Junior — Middle

¿Qué sucederá primero: el procesamiento de la señal de cancelación o la finalización de la grabación, si ocurren simultáneamente en el canal?

sobes.tech AI

Respuesta de la IA

En Go, al intentar enviar una señal de cancelación (por ejemplo, cerrando un canal o enviando un valor) y finalizar la escritura en un canal al mismo tiempo, el orden de procesamiento no está garantizado y depende del planificador de goroutines y del estado de los canales. Los canales en Go sincronizan las operaciones, pero si dos operaciones ocurren simultáneamente, una de ellas se ejecutará primero, aunque esto no está definido por la especificación.

Es decir, si una goroutine intenta escribir en un canal, y otra goroutine cierra ese canal o envía una señal de cancelación al mismo tiempo, no se puede determinar cuál operación será procesada primero. Es importante diseñar la lógica de modo que no se dependa del orden de estos eventos simultáneos.

Ejemplo:

cancel := make(chan struct{})
datos := make(chan int)

// Goroutine que escucha cancel
go func() {
    select {
    case <-cancel:
        fmt.Println("Cancelación recibida")
    case v := <-datos:
        fmt.Println("Valor recibido", v)
    }
}()

// Envío simultáneo
close(cancel) // señal de cancelación
// o
// datos <- 42 // envío en el canal

En este ejemplo, qué rama se ejecutará primero depende del planificador.