Nyx con Ejemplos

Select Channel

La sentencia select multiplexa varios canales, esperando al primero que tenga datos disponibles. Cada case nombra una variable de canal. Es similar a la sentencia select de Go.

Código

// Select — multiplexing multiple channels
// Select — multiplexar múltiples canales

var ch1: Map = Map.new()
var ch2: Map = Map.new()

fn sender1() -> int {
    sleep(10)
    channel_send(ch1, 42)
    return 0
}

fn sender2() -> int {
    sleep(20)
    channel_send(ch2, 99)
    return 0
}

fn main() -> int {
    ch1 = channel_new(1)
    ch2 = channel_new(1)

    thread_spawn(sender1)
    thread_spawn(sender2)

    // Select waits for the first channel that has data
    // and executes the matching case block
    var received: int = 0
    while received < 2 {
        select {
            case ch1 => {
                let val: int = channel_recv(ch1)
                print("from ch1: " + int_to_string(val))
                received = received + 1
            }
            case ch2 => {
                let val: int = channel_recv(ch2)
                print("from ch2: " + int_to_string(val))
                received = received + 1
            }
        }
    }

    print("both received")
    return 0
}

Salida

from ch1: 42
from ch2: 99
both received

Explicación

La sentencia select monitorea múltiples canales simultáneamente. Cuando hay datos disponibles en cualquier canal, se ejecuta la rama case correspondiente. Si varios canales tienen datos, se elige uno.

Dos hilos emisores envían valores tras distintos retardos (10ms y 20ms). El hilo principal usa select dentro de un bucle para recibir del canal que esté listo primero. Como sender1 duerme menos, ch1 suele entregar primero.

Los canales se declaran como tipo Map -- este es un detalle específico de Nyx. El patrón select es esencial para construir sistemas orientados a eventos, timeouts y multiplexores fan-in donde se necesita reaccionar a la primera señal disponible entre varias fuentes.

← Anterior Siguiente →

Source: examples/by-example/63-select-channel.nx