fune/third_party/python/aiohttp/examples/background_tasks.py
Mitchell Hentges a1ee478054 Bug 1725708: Move all possible vendored deps to centralized system r=ahal
Note that, as part of adding this packages to the automated vendoring
system, some dependencies were automatically added - most notably,
dependencies of `taskcluster` that become visible with Python 3.6+.

Also, adds `**/.git` to the exclusions because:
* `.git` is part of our `.hgignore`, but
* `.git` is part of the `aiohttp` `tar.gz` file.

Since the file isn't needed for `pip install`-ing `aiohttp`,
and since we want `./mach vendor python` to be a no-op when there's
no requirement changes, we exclude it.

Differential Revision: https://phabricator.services.mozilla.com/D123122
2021-09-09 18:18:51 +00:00

66 lines
1.8 KiB
Python
Executable file

#!/usr/bin/env python3
"""Example of aiohttp.web.Application.on_startup signal handler"""
import asyncio
import aioredis
from aiohttp import web
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
request.app["websockets"].append(ws)
try:
async for msg in ws:
print(msg)
await asyncio.sleep(1)
finally:
request.app["websockets"].remove(ws)
return ws
async def on_shutdown(app):
for ws in app["websockets"]:
await ws.close(code=999, message="Server shutdown")
async def listen_to_redis(app):
try:
sub = await aioredis.create_redis(("localhost", 6379), loop=app.loop)
ch, *_ = await sub.subscribe("news")
async for msg in ch.iter(encoding="utf-8"):
# Forward message to all connected websockets:
for ws in app["websockets"]:
await ws.send_str(f"{ch.name}: {msg}")
print(f"message in {ch.name}: {msg}")
except asyncio.CancelledError:
pass
finally:
print("Cancel Redis listener: close connection...")
await sub.unsubscribe(ch.name)
await sub.quit()
print("Redis connection closed.")
async def start_background_tasks(app):
app["redis_listener"] = app.loop.create_task(listen_to_redis(app))
async def cleanup_background_tasks(app):
print("cleanup background tasks...")
app["redis_listener"].cancel()
await app["redis_listener"]
def init():
app = web.Application()
app["websockets"] = []
app.router.add_get("/news", websocket_handler)
app.on_startup.append(start_background_tasks)
app.on_cleanup.append(cleanup_background_tasks)
app.on_shutdown.append(on_shutdown)
return app
web.run_app(init())