from aiohttp import web import asyncio async def send_msg1(app): while True: for ws in app['admin_sockets']: await ws.send_str('msg1') await asyncio.sleep(10) async def send_msg2(app): while True: for ws in app['admin_sockets']: await ws.send_str('msg2') await asyncio.sleep(20) async def ws_handler(request): ws = web.WebSocketResponse() await ws.prepare(request) is_admin = request.path.startswith('/ws/admin') a_socks = request.app['admin_sockets'] u_socks = request.app['user_sockets'] if is_admin: a_socks.append(ws) else: u_socks.append(ws) try: async for msg in ws: await ws.send_str(msg.data) except Exception as e: pass finally: if is_admin: a_socks.remove(ws) else: u_socks.remove(ws) return ws app = web.Application() app.router.add_get('/ws', ws_handler) app.router.add_get('/ws/admin', ws_handler) app['admin_sockets'] = [] app['user_sockets'] = [] loop = asyncio.get_event_loop() loop.create_task(send_msg1(app)) loop.create_task(send_msg2(app))
Задачи send_msg1 и send_msg2 будут вызывать тяжеловесные функции, поэтому не хотелось бы, чтобы они работали вхолостую. Можно ли как-то их ставить на паузу, если admin_sockets пустой, и возобновлять, если в admin_sockets появится хотя бы один сокет? Спасибо.