Documentation

LE001: DISTRIBUTED TASK QUEUE (PROCESS + CHANNELS + TASKS + RESULT + OPTION)

Back to documentation index
---
{
  "@context": "https://nxdlang.org/schema",
  "doc_id": "LE001",
  "title": "",
  "description": "",
  "layer": "Examples",
  "category": "Large Examples",
  "keywords": [],
  "doc_version": "1.0",
  "status": "active"
}
---

# LE001: DISTRIBUTED TASK QUEUE (PROCESS + CHANNELS + TASKS + RESULT + OPTION)

### NXD
```nxd
MODULE system.queue

TYPE JOB { ID: int, PAYLOAD: string }
TYPE RESULT UNION { OK(any), ERR(string) }
TYPE OPTION UNION { SOME(any), NONE }

TYPE CHANNEL<JOB> { }
TYPE CHANNEL<RESULT> { }

# Supervisor monitors workers and restarts them on failure
FUNC SUPERVISOR(JOBS, RESULTS):
    LOOP:
        LET JOB SET RECV JOBS
        LET T SET TASK(fn() => PROCESS_JOB(JOB))
        LET OUT SET TRY AWAIT T CATCH E:
            RETURN ERR("worker crashed: " ADD E)
        SEND OUT TO RESULTS

# Worker logic
FUNC PROCESS_JOB(J):
    IF J.PAYLOAD EQ "":
        RETURN ERR("empty payload")
    RETURN OK("processed: " ADD J.PAYLOAD)

# Main queue system
FUNC MAIN():
    LET JOBS SET CHANNEL<JOB>()
    LET RESULTS SET CHANNEL<RESULT>()

    SPAWN SUPERVISOR(JOBS, RESULTS)

    LOOP I FROM 1 TO 5:
        LET J SET JOB { ID: I, PAYLOAD: "task_" ADD I }
        SEND J TO JOBS

    LOOP K FROM 1 TO 5:
        LET R SET RECV RESULTS
        MATCH R:
            CASE OK(V): PRINTLN(V)
            CASE ERR(E): PRINTLN("error: " ADD E)

    RETURN NONE
```