Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Channels (Under The Hood)
Search
Andrew Godwin
November 03, 2016
Programming
1
7.6k
Channels (Under The Hood)
A talk I gave at Django Under The Hood 2016.
Andrew Godwin
November 03, 2016
Tweet
Share
More Decks by Andrew Godwin
See All by Andrew Godwin
Reconciling Everything
andrewgodwin
1
350
Django Through The Years
andrewgodwin
0
270
Writing Maintainable Software At Scale
andrewgodwin
0
480
A Newcomer's Guide To Airflow's Architecture
andrewgodwin
0
380
Async, Python, and the Future
andrewgodwin
2
700
How To Break Django: With Async
andrewgodwin
1
760
Taking Django's ORM Async
andrewgodwin
0
760
The Long Road To Asynchrony
andrewgodwin
0
720
The Scientist & The Engineer
andrewgodwin
1
800
Other Decks in Programming
See All in Programming
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3k
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
170
認証・認可の基本を学ぼう前編
kouyuume
0
270
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
280
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
630
TestingOsaka6_Ozono
o3
0
170
Basic Architectures
denyspoltorak
0
110
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
160
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
160
認証・認可の基本を学ぼう後編
kouyuume
0
250
クラウドに依存しないS3を使った開発術
simesaba80
0
160
Deno Tunnel を使ってみた話
kamekyame
0
230
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
0
160
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
340
Believing is Seeing
oripsolob
0
15
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
0
130
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Done Done
chrislema
186
16k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
65
Writing Fast Ruby
sferik
630
62k
Producing Creativity
orderedlist
PRO
348
40k
Transcript
None
Andrew Godwin Hi, I'm Django core developer Senior Software Engineer
at Used to complain about migrations a lot
It's magic.
It's magic.
The Problem 1
The Web is changing.
WebSockets
WebSockets WebRTC Long-polling MQTT Server-Sent Events
Python is synchronous. Django is synchronous.
Synchronous code is easier to write. Single-process async is not
enough.
Proven design pattern Not too hard to reason about
What could fit these constraints?
Loose Coupling 2
Not too tied to WebSockets Not too tied to Django
Well-defined, minimal interfaces
Easy to swap out or rewrite
The Message Bus HTTP Server Message Bus WSock Server Django
Project
What do you send? How do you send it?
ASGI
nonblocking send blocking receive add to group discard from group
send to group
JSON-compatible, dictionary-based messages onto named channels
Concrete Ideas 3
Develop using concrete examples
WebSocket connect receive disconnect accept/reject send
WebSocket websocket.connect websocket.send!abc1234 websocket.receive websocket.disconnect
At-most-once First In First Out Backpressure via capacity Not sticky
No guaranteed ordering No serial processing
HTTP & WS Channel Layer Django Worker HTTP & WS
Django Worker Django Worker Django Worker
{ "text": "Hello, world!", "path": "/chat/socket/", "reply_channel": "websocket.send!9m12in2p", }
Developed and spec'd HTTP WebSocket Rough drafts IRC Email Slack
Please, no. Minecraft Mainframe Terminal
{ "reply_channel": "http.response!g23vD2x5", "method": "GET", "http_version": "2", "path": "/chat/socket/", "query_string":
"foo=bar", "headers": [["cookie", "abcdef..."]], }
At-most-once First In First Out Backpressure via capacity Not sticky
No guaranteed ordering No serial processing
At-most-once First In First Out Backpressure via capacity Not sticky
No guaranteed ordering No serial processing
"order" key on receive messages Connection acceptance
Daphne HTTP/WebSocket Server Channels Django integration asgi-redis Redis backend asgi-ipc
Local memory backend asgiref Shared code and libs
Django-ish 4
It can take several tries to get a nice API.
Consumers based on Views Callable that takes an object Decorators
for functionality Class-based generics
@channel_session def chat_receive(message): name = message.channel_session["name"] message.reply_channel.send({"text": "OK"}) Group("chat").send({ "text":
"%s: %s" % (name, message["text"]), }) Message.objects.create( name=name, content=message["text"], )
Routing based on URLs List of regex-based matches Includes with
prefix stripping on paths More standardised interface
routing = [ route( "websocket.receive", consumers.chat_receive, path=r"^/chat/socket/$", ), include("stats.routing", path="^/stats/"),
route_class(ConsumerClass, path="^/v1/"), ]
Sessions are the only state Sessions hang off reply channels
not cookies Uses same sessions backends Available on the consumer's argument Can also access long-term cookie sessions
@enforce_ordering def receive_consumer(message): Log.objects.create(...)
session = session_for_reply_channel( message.reply_channel.name ) if not session.exists(session.session_key): try: session.save(must_create=True)
except CreateError: # Session wasn't unique raise ConsumeLater() message.channel_session = session
No Middleware New-style middleware half works No ability to capture
sends Decorators replace most cases
View/HTTP Django still there Can intermingle or just use one
type View system is just a consumer now
def view_consumer(message): replies = AsgiHandler()(message) for reply in replies: while
True: try: message.reply_channel.send(reply) except ChannelFull: time.sleep(0.05) else: break
Signals and commands runserver works as expected Signals for handling
lifecycle staticfiles configured for development
Beyond 5
Generalised async communication
Service messaging Security/CPU separation Sync & Async / Py2 &
Py3
Diversity of implementations More web servers More channel layers
More optimisation More efficient bulk sends Less network traffic on
receive
More maintainers More viewpoints, more time
1.0 coming soon Stable APIs for everything except binding
Thanks. Andrew Godwin @andrewgodwin channels.readthedocs.io github.com/andrewgodwin/channels-examples