Nyx con Ejemplos

Spawn y Channel

Nyx admite programación concurrente mediante threads y channels. Un channel es una cola tipada y bufferizada que permite a los threads comunicarse de forma segura sin estado mutable compartido. thread_spawn inicia un nuevo thread del sistema operativo ejecutando una closure, mientras que channel_send y channel_recv transfieren valores entre threads.

Código

// 20: Concurrency — spawn thread + channel communication
fn main() -> int {
    let ch: Map = channel_new(5)

    fn producer() {
        var i: int = 0
        while i < 5 {
            channel_send(ch, i * 10)
            i = i + 1
        }
    }

    thread_spawn(producer)

    // Receive 5 values from the channel
    var total: int = 0
    var n: int = 0
    while n < 5 {
        let val: int = channel_recv(ch)
        print("received: " + int_to_string(val))
        total = total + val
        n = n + 1
    }
    print("total: " + int_to_string(total))

    return 0
}

Salida

received: 0
received: 10
received: 20
received: 30
received: 40
total: 100

Explicación

channel_new(capacity) crea un channel bufferizado que puede contener hasta capacity valores antes de que el emisor se bloquee. El channel está tipado como Map en el sistema de tipos de Nyx — esto es un handle opaco a la estructura de channel del runtime subyacente. La capacidad de 5 coincide con la cantidad de valores que enviará el productor, por lo que en este ejemplo no ocurre ningún bloqueo.

La función producer se define como una closure dentro de main, lo que significa que captura ch del ámbito envolvente. thread_spawn(producer) inicia un nuevo thread del sistema operativo que ejecuta producer de forma concurrente con el resto de main. El channel actúa como punto de sincronización: channel_recv en el thread principal se bloqueará hasta que haya un valor disponible.

Este patrón productor-consumidor es fundamental en los programas concurrentes de Nyx. Para coordinación más compleja — múltiples productores, fan-out o timeouts — Nyx también ofrece bloques select (al estilo Go), Mutex, WaitGroup, y el scheduler M:N de work-stealing. Los channels siguen siendo la forma preferida de pasar datos entre threads porque eliminan la necesidad de locks sobre estado compartido.

← Anterior Siguiente →

Source: examples/by-example/20-spawn-channel.nx