‹ Back to Blog

Celery 5.7.0 Makes Canvas Workflows and Workers More Reliable.

Engineering Python

Background jobs are where reliability problems like to hide, because a task that silently fails or quietly duplicates doesn’t page anyone the way a down web server does. Celery 5.7.0 is a stable release aimed squarely at that soft spot: more predictable Canvas workflows, steadier workers, and cleaner result handling. Scout Monitoring instruments Celery task execution, so a release that changes how chains and chords run is a good reason to watch your queues through the upgrade. Add Scout to your Celery workers for free and you’ll see any shift in task timing or volume as it happens.

Canvas Workflows Got a Serious Pass

If you compose tasks with chains, groups, and chords, this is the headline. Celery 5.7 reworks how complex workflows are built and how failures move through them.

The most practical wins: failure now propagates correctly through chained tasks into chord bodies, chord error handling is fixed when the body is itself a chain, and empty groups and chains, including empty groups nested inside chains, are handled rather than producing surprises. Chains are now constructed in a single pass instead of repeatedly folding signatures with the | operator, which also cuts unnecessary message growth in chains of chords, chains of groups, and implicit chords.

There’s a subtle correctness fix worth calling out: cloned signatures no longer share mutable keyword arguments with their originals. If you’ve ever reused a signature and watched options bleed between invocations, that class of bug is addressed. Callback handling is tightened too, so a task replaced by a chain doesn’t fire its callbacks repeatedly.

Net effect: fewer orphaned chords, fewer duplicated callbacks, and less broker traffic for the same workflow.

Workers Shut Down and Recover More Gracefully

The second theme is worker lifecycle. Celery 5.7 improves connection recovery, graceful shutdown, prefork process management, and autoscaling.

A few changes stand out for production. There’s a new task_retry_on_worker_lost setting to control whether tasks are requeued after a worker process is lost, which is a knob you’ll want deliberately set rather than defaulted. Prefork shutdown now drains child results and acknowledges tasks during shutdown, reducing the odds of a task left in limbo when a worker stops. Warm-shutdown issues with Eventlet and thread-based pools are fixed. And --concurrency=auto is now cgroup-aware, so a worker in a container sizes itself to the container’s limits instead of the host’s, which is exactly the fix you want in Kubernetes.

Results, Scheduling, and Python Support

Result handling is more consistent: better result-state consistency, saner ignore_result behavior, improved retry handling, and more reliable concurrent AsyncResult tracking. The Redis result backend gains new expiration settings for chord and failure results and more reliable chord accounting, and there’s new pymemcache result-backend support.

Scheduling is steadier across daylight-saving transitions, with more reliable ETA, countdown, expiration, crontab, and solar schedules, which is the sort of thing that only bites you twice a year but bites hard when it does.

One compatibility note to plan around: Python 3.10 is now the minimum. If you’re still on 3.9, this release is a reason to move, and the upgrade now carries compatibility work for newer Python versions through 3.14.

Watch the Upgrade Through Your Queues

Here’s the thing about a release that touches Canvas internals and worker lifecycle: the changes are mostly improvements, but they’re changes to the exact machinery that determines how your tasks are named, timed, and tracked as parent and child. The right move is to upgrade and then confirm your workflows behave, rather than assume they do.

This is where task-level monitoring pays off. With Scout, your Celery jobs show up with their execution time, throughput, and errors, and complex workflows are visible as the related tasks they actually are. After you upgrade to 5.7.0, watch your chained and chorded jobs for a cycle: are task durations steady, is throughput where you expect, and did the error rate on your workflow tasks stay flat? If the new chain construction or chord accounting shifts how a workflow runs, you see it as a timing or volume change on a chart instead of discovering it through a downstream job that never fired.

Scout ties errors back to the specific job that produced them, so a retry pattern that changes after the bump is traceable rather than mysterious. And because the data spans before and after the deploy, you get a clean comparison instead of a guess.

Upgrade, set task_retry_on_worker_lost the way your workload actually wants it, and let your queue dashboards confirm the workflows are healthier than before. Add Scout to your Python app for free and keep your background jobs as visible as your web requests.