Nyx con Ejemplos

Pool de Workers

Un pool de workers despacha tareas a un número fijo de hilos a través de un canal compartido. Los workers extraen tareas, las procesan, y envían resultados a un canal de resultados. Este patrón es el que usa http_serve_mt para implementar su pool de hilos internamente.

Código

// Worker pool — dispatching tasks to N threads via channels
// Pool de workers — despachar tareas a N hilos via canales

var work_ch: Map = Map.new()
var done_ch: Map = Map.new()

fn worker() -> int {
    while true {
        let task: int = channel_recv(work_ch)
        if task < 0 { return 0 }
        // Simulate work: compute square
        let result: int = task * task
        channel_send(done_ch, result)
    }
    return 0
}

fn main() -> int {
    work_ch = channel_new(20)
    done_ch = channel_new(20)

    // Spawn 4 workers
    let num_workers: int = 4
    var handles: Array = []
    var i: int = 0
    while i < num_workers {
        let h: int = thread_spawn(worker)
        handles.push(h)
        i = i + 1
    }

    // Send 8 tasks
    let num_tasks: int = 8
    i = 0
    while i < num_tasks {
        channel_send(work_ch, i + 1)
        i = i + 1
    }

    // Collect results
    i = 0
    while i < num_tasks {
        let result: int = channel_recv(done_ch)
        print("result: " + int_to_string(result))
        i = i + 1
    }

    // Send stop signals
    i = 0
    while i < num_workers {
        channel_send(work_ch, -1)
        i = i + 1
    }

    print("all tasks completed")
    return 0
}

Salida

result: 1
result: 4
result: 9
result: 16
result: 25
result: 36
result: 49
result: 64
all tasks completed

Explicación

Dos canales coordinan el pool: work_ch distribuye tareas y done_ch recolecta resultados. Ambos se declaran como Map -- el tipo de canal estándar en Nyx.

Cuatro hilos worker recorren en bucle channel_recv(work_ch), calculando el cuadrado de cada valor recibido y enviando resultados a done_ch. Un valor de tarea negativo funciona como píldora envenenada, haciendo que el worker termine.

El hilo principal envía 8 tareas (valores 1-8), recolecta los 8 resultados, y luego envía 4 señales de detención (una por worker). El orden de los resultados puede variar entre ejecuciones porque los workers se ejecutan concurrentemente, pero los 8 cuadrados siempre aparecerán. Este es el mismo patrón que usa internamente http_serve_mt para manejar solicitudes HTTP a través de un pool de hilos.

← Anterior Siguiente →

Source: examples/by-example/59-worker-pool.nx