Вы можете создать функцию широковещания, которая считывает ws
один раз и передает каждое сообщение нескольким генераторам. Например (не проверено):
def broadcast(stream, num):
# iterate over the stream just once, but put each message into
# multiple queues
queues = []
async def consume():
async for msg in stream:
for queue in queues:
await queue.put(msg)
for queue in queues:
await queue.put(None)
asyncio.create_task(consume())
# create the queues and return the generators that transmit
# their contents
async def transmit(queue):
while True:
msg = await queue.get()
if msg is None:
break
yield msg
iters = []
for _ in range(num):
queue = asyncio.Queue()
iters.append(transmit(queue))
queues.append(queue)
return iters
С этим на месте вы main()
могли бы выглядеть так:
async def main():
async with websockets.connect("wss://echo.websocket.org") as ws:
foo_stream, bar_stream = broadcast(ws, 2)
asyncio.create_task(foo(foo_stream))
asyncio.create_task(bar(bar_stream))
await ws.send("Hello")