Skip to content

Engines overview

z4j supports six engines, each with its own adapter package (z4j-<engine>).

Engine Package Broker Strengths Default scheduler
Celery z4j-celery Redis / RabbitMQ / SQS Massive ecosystem, chords/groups/chains celery-beat
RQ z4j-rq Redis Simple, small surface, Python-only rq-scheduler
Dramatiq z4j-dramatiq Redis / RabbitMQ Reliable, middleware-first APScheduler
Huey z4j-huey Redis / Sqlite / in-memory Minimal deps, great for Django built-in periodic
arq z4j-arq Redis Async-native, great for FastAPI arq cron
taskiq z4j-taskiq Redis / RabbitMQ / NATS / in-memory Modern async, pluggable brokers taskiq-scheduler

Pick one or more. They can coexist in the same process:

Terminal window
pip install z4j-celery z4j-rq z4j-dramatiq
Feature Celery RQ Dramatiq Huey arq taskiq
Retry (native) polyfill
Cancel (native) partial - partial
Bulk retry polyfill polyfill polyfill polyfill polyfill polyfill
Queue purge
Chord / group aware - - - - -
Result store visibility partial
Native scheduler celery-beat rq-scheduler - built-in cron jobs taskiq-scheduler

“polyfill” = brain implements via re-enqueue + cancel. Users see no difference in the UI.

Each adapter uses the engine’s native signal / middleware / hook system:

Engine Capture mechanism
Celery task_sent / task_prerun / task_postrun / task_retry / task_failure signals
RQ Queue.enqueue_call monkey-patch + job lifecycle hooks
Dramatiq custom Middleware that hooks before_process_message / after_process_message
Huey signal handlers (SIGNAL_ENQUEUED / SIGNAL_EXECUTING / SIGNAL_EXECUTED)
arq on_job_start / on_job_end hooks on the worker
taskiq middleware: TaskiqMiddleware.pre_send / post_execute

Patches are additive - they don’t replace your existing signal handlers.

See the left sidebar - one page per engine with install, config, events, actions, and caveats.