Workers
Isolated workers that scale with your workload
Route jobs by tag, scale horizontally, and deploy workers anywhere. Every job runs in its own isolated environment.
Where your code actually runs
When you run a script or a flow in Windmill, the code does not execute on the server. It is picked up by a worker, an isolated process that runs one job at a time. The server handles the API, UI, and scheduling. Workers handle execution. You can run one worker or hundreds, on the same machine or across continents.
How workers work
Windmill uses a pull model: each worker independently grabs one job at a time from the PostgreSQL queue. No coordinator, no message broker. A single worker handles ~26M jobs/month at ~100ms per job. Add more workers for more throughput, scaling is linear.
Read the docsWorker groups
Assign tags to workers and route jobs to specific groups. Default groups include "default" for language jobs and "native" for SQL/API calls with 8 subworkers. Create custom groups for GPU, high-memory, or environment-specific workloads. Use dynamic tags like $workspace or $args[argName] for flexible routing.
Dedicated workers
Dedicated workers pin a worker to a single script so the runtime stays warm permanently (Enterprise). Supported for TypeScript (Bun/Deno), Python, and nativets. Execution overhead drops to ~12ms per job versus ~50ms for standard workers, making them 1.35x faster than AWS Lambda for lightweight tasks.
Read the docsAgent workers
Agent workers connect to the server over HTTP only, with no direct database access (Enterprise). Deploy workers behind firewalls, in remote data centers, or on edge infrastructure. Run on Linux, Windows, or macOS without Docker.
Read the docsInit scripts
Run init scripts at worker startup to pre-install dependencies, configure tools, or warm caches. Periodic scripts run maintenance tasks at regular intervals. Configured through the Worker Management UI.
Read the docsAutoscaling
Scale workers automatically based on queue depth. Kubernetes-native autoscaling (auto-discovers namespace/credentials), ECS, and custom script-based scaling are all supported. Occupancy-based thresholds: 75% to scale out, 25% to scale in, with configurable cooldown. Checks every 30 seconds and supports scale to zero when idle.
Read the docsConcurrency and priority
Set global concurrency limits per script to avoid API rate limits. Configure time windows, max executions, and custom concurrency keys. Assign priority levels from 1 to 100 so critical jobs always run first.
Read the docsBenchmarks
Windmill scales linearly to 100+ workers with near-theoretical throughput. 100 workers achieve 981 jobs/sec on 100ms jobs. Dedicated workers run fibonacci in 54ms versus Lambda's 73ms. Benchmark data is publicly available and reproducible.
Read the docsFrequently asked questions
Build your internal platform on Windmill
Scripts, flows, apps, and infrastructure in one place.