Taking Channels Async

Taking Channels Async

A talk I gave at DjangoCon Europe 2018.

077e9a0cb34fa3eba2699240c9509717?s=128

Andrew Godwin

May 24, 2018
Tweet

Transcript

  1. 2.

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

    Senior Software Engineer at • Does network programming for "fun"
  2. 7.

    Webserver (Twisted) Django (Sync worker process) Clients Channel Layer (Redis

    or other) Webserver (Twisted) Django (Sync worker process)
  3. 12.
  4. 15.

    WSGI/ASGI Handler (request translator) URL Routing (path to view mapping)

    Django Middleware (auth, sessions, etc.) Views (logic and presentation) ORM (database kerfuffling)
  5. 16.

    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
  6. 18.
  7. 25.

    Async code runs on the event loop We need to

    go find it! Or make our own.
  8. 26.

    # 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()
  9. 27.

    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
  10. 32.

    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
  11. 34.

    ASGI: It's like WSGI but with an A in it

    Also asyncio and stuff like that
  12. 35.
  13. 40.
  14. 42.

    Do we want to have everyone writing async? What's the

    balance? How do we be flexible enough?