This document describes the current stable version of Celery (5.6). For development docs, go here.
Concurrency¶
- Release:
5.6
- Date:
Jul 05, 2026
Concurrency in Celery enables the parallel execution of tasks. The default model, prefork, is well-suited for many scenarios and generally recommended for most users. In fact, switching to another mode will silently disable certain features like soft_timeout and max_tasks_per_child.
This page gives a quick overview of the available options which you can pick between using the –pool option when starting the worker.
Overview of Concurrency Options¶
prefork: The default option, ideal for CPU-bound tasks and most use cases. It is robust and recommended unless there’s a specific need for another model.
eventlet and gevent: Designed for IO-bound tasks, these models use greenlets for high concurrency. Note that certain features, like soft_timeout, are not available in these modes. These have detailed documentation pages linked below.
solo: Executes tasks sequentially in the main thread.
threads: Utilizes threading for concurrency, available if the concurrent.futures module is present.
custom: Enables specifying a custom worker pool implementation through environment variables.
Note
On Windows, the default prefork pool uses spawn instead of
fork to create worker processes. This means per-process worker
optimizations set up in the main process are not inherited by
workers. If you see RuntimeError: fast_trace_task: worker task
registry is empty, switch to --pool=solo or --pool=threads.
Note
While alternative models like eventlet and gevent are available, they may lack certain features compared to prefork. We recommend prefork as the starting point unless specific requirements dictate otherwise.