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.
// 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 }
result: 1 result: 4 result: 9 result: 16 result: 25 result: 36 result: 49 result: 64 all tasks completed
Cómo funciona
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.