+-
如何将连续的'async with'语句重写为循环?

我有以下摘录,除了要求我知道我计划提前打开多少个WebSockets之外,它在各个方面都能正常工作。

如果我开始使用主机列表并且必须创建N个WebSocket连接,我怎样才能在循环中完成此代码对3个Websockets(通过'async with')的N所做的事情?

等待我已经在循环中,它是“异步”,我无法弄清楚如何“循环”。

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)
2
投票

从Python3.7开始,AsyncExitStack模块中有contextlib,这就是它如何用于您的问题:

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
    ]