The Fix
pip install celery==5.6.0
Based on closed celery/celery issue #9787 · PR/commit linked
Production note: This usually shows up under retries/timeouts. Treat it as a side-effect risk until you can verify behavior with a canary + real traffic.
@@ -1577,10 +1577,48 @@ The default value is the class provided by Celery: ``'celery.app.task:Task'``.
--------
+Task handlers are methods that execute at specific points in a task's lifecycle.
+All handlers run **synchronously** within the same worker process and thread
+that executes the task.
...
.. method:: on_failure(self, exc, task_id, args, kwargs, einfo)
This is an independent process that is triggered after the task failed and returned. It is run by the worker the task was executed on.
...
Re-run the minimal reproduction on your broken version, then apply the fix and re-run.
Option A — Upgrade to fixed release\npip install celery==5.6.0\nWhen NOT to use: This fix is not applicable if the documentation is already clear and accurate.\n\n
Why This Fix Works in Production
- Trigger: - [x] I have included all related issues and possible duplicate issues in this issue
- Mechanism: The documentation was unclear about the execution order and context of task handlers
- Why the fix works: Updates the Task Handlers documentation to clarify the execution context, timing, and order of handlers, addressing the confusion described in issue #9787. (first fixed release: 5.6.0).
- If left unfixed, the same config can fail only in production (env differences), causing startup failures or partial feature outages.
Why This Breaks in Prod
- The documentation was unclear about the execution order and context of task handlers
- Production symptom (often without a traceback): - [x] I have included all related issues and possible duplicate issues in this issue
Proof / Evidence
- GitHub issue: #9787
- Fix PR: https://github.com/celery/celery/pull/9804
- First fixed release: 5.6.0
- Reproduced locally: No (not executed)
- Last verified: 2026-02-09
- Confidence: 0.85
- Did this fix it?: Yes (upstream fix exists)
- Own content ratio: 0.64
Discussion
High-signal excerpts from the issue thread (symptoms, repros, edge-cases).
“Hi @SlowMo24, Yes, the documentation seemed to be off. I’ve updated it with the relevant details - https://github.com/celery/celery/pull/9804. Could you take a look at it?…”
“can we also close https://github.com/celery/celery/issues/5905 ?”
“> Hi @SlowMo24, > > Yes, the documentation seemed to be off. I’ve updated it with the relevant details - #9804. Could you take a…”
Failure Signature (Search String)
- - [x] I have included all related issues and possible duplicate issues in this issue
- or possible duplicates to this issue as requested by the checklist above.
Copy-friendly signature
Failure Signature
-----------------
- [x] I have included all related issues and possible duplicate issues in this issue
or possible duplicates to this issue as requested by the checklist above.
Error Message
Signature-only (no traceback captured)
Error Message
-------------
- [x] I have included all related issues and possible duplicate issues in this issue
or possible duplicates to this issue as requested by the checklist above.
Minimal Reproduction
...
.. method:: on_failure(self, exc, task_id, args, kwargs, einfo)
This is an independent process that is triggered after the task failed and returned. It is run by the worker the task was executed on.
...
What Broke
Developers faced confusion regarding task handler execution, leading to potential mismanagement of task states.
Why It Broke
The documentation was unclear about the execution order and context of task handlers
Fix Options (Details)
Option A — Upgrade to fixed release Safe default (recommended)
pip install celery==5.6.0
Use when you can deploy the upstream fix. It is usually lower-risk than long-lived workarounds.
Fix reference: https://github.com/celery/celery/pull/9804
First fixed release: 5.6.0
Last verified: 2026-02-09. Validate in your environment.
When NOT to Use This Fix
- This fix is not applicable if the documentation is already clear and accurate.
Verify Fix
Re-run the minimal reproduction on your broken version, then apply the fix and re-run.
Did This Fix Work in Your Case?
Quick signal helps us prioritize which fixes to verify and improve.
Prevention
- Capture the exact failing error string in logs and tests so you can reproduce via a minimal script.
- Pin production dependencies and upgrade only with a reproducible test that hits the failing path.
Version Compatibility Table
| Version | Status |
|---|---|
| 5.6.0 | Fixed |
Related Issues
No related fixes found.
Sources
We don’t republish the full GitHub discussion text. Use the links above for context.