Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Taking Channels Async

Taking Channels Async

A talk I gave at DjangoCon Europe 2018.

Andrew Godwin

May 24, 2018
Tweet

More Decks by Andrew Godwin

Other Decks in Programming

Transcript

  1. Hi, I’m Andrew Godwin • Django core team member •

    Senior Software Engineer at • Does network programming for "fun"
  2. Webserver (Twisted) Django (Sync worker process) Clients Channel Layer (Redis

    or other) Webserver (Twisted) Django (Sync worker process)
  3. WSGI/ASGI Handler (request translator) URL Routing (path to view mapping)

    Django Middleware (auth, sessions, etc.) Views (logic and presentation) ORM (database kerfuffling)
  4. WSGI/ASGI Handler (request translator) URL Routing (path to view mapping)

    Django Middleware (auth, sessions, etc.) Views (logic and presentation) ORM (database kerfuffling) ASGI Routing (path/protocol/etc. mapping) ASGI Middleware (auth, sessions, etc.) Consumers (logic and presentation) synchronous
  5. Async code runs on the event loop We need to

    go find it! Or make our own.
  6. # Make a future for the return information call_result =

    Future() # Use call_soon_threadsafe to schedule a synchronous callback on the # main event loop's thread if not (self.main_event_loop and self.main_event_loop.is_running()): # Make our own event loop and run inside that. loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: loop.run_until_complete(self.main_wrap(args, kwargs, call_result)) finally: try: if hasattr(loop, "shutdown_asyncgens"): loop.run_until_complete(loop.shutdown_asyncgens()) finally: loop.close() asyncio.set_event_loop(self.main_event_loop) else: self.main_event_loop.call_soon_threadsafe( self.main_event_loop.create_task, self.main_wrap( args, kwargs, call_result, ), ) # Wait for results from the future. return call_result.result()
  7. Make a Future Jump to the main thread and add

    the coroutine Tie the coroutine's end to triggering the Future Block the thread on the Future
  8. ASGI Handler (ASGI-to-request translator) URL Routing (path to view mapping)

    Django Middleware (auth, sessions, etc.) Views (logic and presentation) ORM (database kerfuffling) ASGI Routing (path/protocol/etc. mapping) ASGI Middleware (auth, sessions, etc.) Consumers (logic and presentation) synchronous
  9. ASGI: It's like WSGI but with an A in it

    Also asyncio and stuff like that
  10. Do we want to have everyone writing async? What's the

    balance? How do we be flexible enough?