Celery v5.6.0 is now available.
Key Highlights
See What's new in Celery 5.6 for a complete overview or read the main highlights below.
Python 3.9 Minimum Version
Celery 5.6.0 drops support for Python 3.8 (EOL). The minimum required Python version is now 3.9. Users still on Python 3.8 must upgrade their Python version before upgrading to Celery 5.6.0.
Additionally, this release includes initial support for Python 3.14.
SQS: Reverted to pycurl from urllib3
The switch from pycurl to urllib3 for the SQS transport (introduced in Celery 5.5.0 via Kombu) has been reverted due to critical issues affecting SQS users.
Contributed by @auvipy in #9620.
Security Fix: Broker Credential Leak Prevention
Fixed a security issue where broker URLs containing passwords were being logged in plaintext by the delayed delivery mechanism. Broker credentials are now properly sanitized in all log output.
Contributed by @giancarloromeo in #9997.
Memory Leak Fixes
Two significant memory leaks have been fixed in this release:
Exception Handling Memory Leak: Fixed a critical memory leak in task exception handling that was particularly severe on Python 3.11+ due to enhanced traceback data. The fix properly breaks reference cycles in tracebacks to allow garbage collection.
Contributed by @jaiganeshs21 in #9799.
Pending Result Memory Leak: Fixed a memory leak where AsyncResult subscriptions were not being cleaned up when results were forgotten.
Contributed by @tsoos99dev in #9806.
ETA Task Memory Limit
New configuration option worker_eta_task_limit to prevent out-of-memory crashes when workers fetch large numbers of ETA or countdown tasks. Previously, workers could exhaust available memory when the broker contained many scheduled tasks.
Example usage:
app.conf.worker_eta_task_limit = 1000Contributed by @sashu2310 in #9853.
Queue Type Selection for Auto-created Queues
New configuration options allow specifying the queue type and exchange type when Celery auto-creates missing queues. This is particularly useful for RabbitMQ users who want to use quorum queues with auto-created queues.
Configuration options:
task_create_missing_queue_type: Sets the queue type for auto-created queues (e.g.,quorum,classic)task_create_missing_queue_exchange_type: Sets the exchange type for auto-created queues
Example usage:
app.conf.task_create_missing_queue_type = 'quorum'Contributed by @ghirailghiro in #9815.
What's Changed
Full Changelog: v5.6.0rc2...v5.6.0