How to rewrite consecutive 'async with' statements into a loop?

Dav*_*ave 5 python websocket async-await

我有以下摘录在各个方面都可以正常使用,但是它要求我知道我计划提前打开多少WebSocket。

相反,如果我从一个主机列表开始并且必须创建N个WebSocket连接,那么如何在循环中为N个3个Websocket(通过“异步与”)完成此代码的工作?

我已经在循环中等待着,这是我无法弄清楚如何“循环”的“与...异步”。

async with websockets.connect('ws://192.168.0.174:81') as websocket1:
    async with websockets.connect('ws://192.168.0.194:81') as websocket2:
        async with websockets.connect('ws://192.168.0.179:81') as websocket3:

            datatosend = GetBallData()

            for socket in [websocket1, websocket2, websocket3]:
                await socket.send(datatosend)
Run Code Online (Sandbox Code Playgroud)

san*_*ash 2

从Python3.7开始,模块中提供了AsyncExitStackcontextlib,这就是它如何用于您的问题:

hosts = ['ws://192.168.0.174:81', 'ws://192.168.0.194:81', 'ws://192.168.0.179:81']
async with contextlib.AsyncExitStack() as stack:
    sockets = [
        await stack.enter_async_context(websockets.connect(host))
        for host in hosts
    ]
Run Code Online (Sandbox Code Playgroud)