NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1987 most downloaded on PyPI
Redis-backed ASGI channel layer implementation
Last release 1 years ago
22 Jul 2025
Ships fairly regularly
a new release about every 5 months
Nearly every release is documented
notes for 28 of 28 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
30 releases · first in 2018
Dropped support for EOL Python 3.8.
Added support for Python 3.13.
Dropped support for EOL Python 3.8.
Updated Channels dependency to at least v4.2.2.
Updated asgiref dependency to at least v3.9.1.
Fixed compatibility with latest versions of pytest-asyncio.
Renamed internal methods in core channel layer for compatibility with Channels v4.2.1+
Dropped testing against legacy Channels v3 branch.
Updated testing against latest redis-py versions.
Added a way to register and use custom serializer formats. See README.rst.
One column per quarter.
Dropped support for end-of-life Python 3.7.
Dropped support for end-of-life Python 3.7.
Added support for Python 3.11 and 3.12.
Upped the minimum version of redis-py to 4.6.
Added CI testing against redis-py versions 4.6, 5, and the development branch.
Added CI testing against Channels versions 3, 4, and the development branch.
Updated the minimum redis-py version to 4.5.3 because of a security release there. Note that this is not a security issue in channels-redis: installin…
Adjusted the way Redis connections are handled:
Connection handling is now shared between the two, core and pub-sub, layers.
Both layers now ensure that connections are closed when an event loop shuts down.
In particular, redis-py 4.x requires that connections are manually closed.
In 4.0 that wasn't done by the core layer, which led to warnings for people
using async_to_sync(), without closing connections when updating from
3.x.
Updated the minimum redis-py version to 4.5.3 because of a security release there. Note that this is not a security issue in channels-redis: installing an earlier version will still use the latest redis-py, but by bumping the dependency we make sure you'll get redis-py too, when you install the update here.
Version 4.0.0 migrates the underlying Redis library from aioredis to redis-py. (aioredis was retired and moved into redis-py, which will host the ongo
Version 4.0.0 migrates the underlying Redis library from aioredis to redis-py.
(aioredis was retired and moved into redis-py, which will host the ongoing development.)
Version 4.0.0 should be compatible with existing Channels 3 projects, as well as Channels 4 projects.
Migrated from aioredis to redis-py. Specifying hosts as tuples is no longer supported.
If hosts are specified as dicts, only the address key will be taken into account, i.e.
a `password`` must be specified inline in the address.
Added support for passing kwargs to sentinel connections.
Updated dependencies and obsolete code.
Nothing published for this version
Nothing published for this version
Fixed RuntimeError when checking for stale connections.
Dropped support for Python 3.6, which is now end-of-life, and added CI testing for Python 3.10. (#301).
Dropped support for Python 3.6, which is now end-of-life, and added CI testing for Python 3.10. (#301).
Added serialize and deserialize hooks to RedisPubSubChannelLayer (#281).
Fixed iscoroutine check for pubsub proxied methods (#297).
Fix workers support when using Redis PubSub layer (#298)
Two bugfixes for the PubSub channel layer:
Two bugfixes for the PubSub channel layer:
Scoped the channel layer per-event loop, in case multiple loops are in play (#262).
Ensured consistent hashing PubSub was maintained across processes, or process restarts (#274).
The RedisPubSubChannelLayer is currently marked as *Beta*. Please report any issues, and be prepared that there may be breaking changes whilst it matu…
Two important new features:
You can now connect using Redis Sentinel <https://redis.io/topics/sentinel>. Thanks to @qeternity.
There's a new RedisPubSubChannelLayer that uses Redis Pub/Sub to
propagate messages, rather than managing channels and groups directly within
the layer. For many use-cases this should be simpler, more robust, and more
performant.
Note though, the new RedisPubSubChannelLayer layer does not provide all
the options of the existing layer, including expiry, capacity, and
others. Please assess whether it's appropriate for your needs, particularly
if you have an existing deployment.
The RedisPubSubChannelLayer is currently marked as Beta. Please report
any issues, and be prepared that there may be breaking changes whilst it
matures.
The RedisPubSubChannelLayer accepts on_disconnect and
on_reconnect config options, providing callbacks to handle the relevant
connection events to the Redis instance.
Thanks to Ryan Henning @acu192.
For both features see the README for more details.
Adjusted dependency specifiers to allow updating to the latest versions of asgiref and Channels.
asgiref and Channels.Ensured per-channel queues are bounded in size to avoid a slow memory leak if consumers stop reading.
Ensured per-channel queues are bounded in size to avoid a slow memory leak if consumers stop reading.
Queues are bound to the channel layer's configured capacity. You may
adjust this to a suitably high value if you were relying on the previously
unbounded behaviour.
Fixed error in Lua script introduced in 3.0.0.
Updated msgpack requirement to ~=1.0.
Redis >= 5.0 is now required.
Updated msgpack requirement to ~=1.0.
Ensured channel names are unique using UUIDs.
Ensured messages are expired even when channel is in constant activity.
Optimized Redis script caching.
Reduced group_send failure logging level to reduce log noise.
Removed trailing : from default channel layer prefix to avoid double
:: in group keys. (You can restore the old default specifying
prefix="asgi:" if necessary.)
Fixed a bug where ConnectionPool.pop() might return an invalid connection.
Fixed a bug where ConnectionPool.pop() might return an invalid
connection.
Added logging for a group_send over capacity failure.
Fixed compatibility with Python 3.8.
Updated ASGI and Channels dependencies for ASGI v3.
Enforced Python 3.6 and up because 3.5 is too unreliable.
Bumped msgpack to 0.6
Enforced Python 3.6 and up because 3.5 is too unreliable.
Fix memory leaks with receive_buffer
Fix memory leaks with receive_buffer
Prevent double-locking problems with cancelled tasks
Fix issue with leaking of connections and instability introduced in 2.3.0
Messages to the same process (with the same prefix) are now bundled together in a single message for efficiency.
Messages to the same process (with the same prefix) are now bundled together in a single message for efficiency.
Connections to Redis are now kept in a connection pool with significantly improved performance as a result. This change required lists to be changed from oldest-first to newest-first, so immediately after any upgrade, existing messages in Redis will be drained in reverse order until your expiry time (normally 60 seconds) has passed. After this, behaviour will be normal again.
Fixed a bug in group_send where it would not work if channel_capacity was set
The group_send method now uses Lua to massively increase the speed of sending to large groups.
Fixed bug where receiving messages would hang after a while or at high concurrency levels.
Fixed bug where receiving messages would hang after a while or at high concurrency levels.
Fixed bug where the default host values were invalid.
Internals have been reworked to remove connection pooling and sharing. All operations will now open a fresh Redis connection, but the backend will no
Don't allow connection pools from other event loops to be re-used (fixes various RuntimeErrors seen previously)
Don't allow connection pools from other event loops to be re-used (fixes various RuntimeErrors seen previously)
channel_capacity is compiled in the constructor and now works again
Capacity enforcement was off by one; it's now correct
Capacity enforcement was off by one; it's now correct
group_send no longer errors with the wrong ChannelFull exception
Dependency fix in packaging so asgiref is set to ~=2.1, not ~=2.0.0
Rewrite and rename to channels_redis to be based on asyncio and the Channels 2 channel layer specification.
Your coding agent can read these notes before it upgrades. Set up the MCP server →