【问题标题】:How to rewrite consecutive 'async with' statements into a loop?如何将连续的“async with”语句重写为循环?
【发布时间】:2019-03-23 20:02:14
【问题描述】:

我有以下摘录,除了它要求我知道我计划提前打开多少个 WebSocket 之外,它在各个方面都很好用。

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

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

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)

【问题讨论】:

  • 我无能为力,但 +1 表示“循环”。
  • 也许这应该被表述为一个自制的上下文管理器,它接收地址数组并返回 websockets 数组。喜欢,async with myconnector(['192.168.0.174:81','192.168.0.194:81','192.168.0.179:81']) as websockets: for sock in websockets: .....
  • 但是看起来你在这里也不需要严格的顺序,所以它可以是一个生成器,它可以获取地址数组并在响应时以随机顺序生成 websocket。

标签: python websocket async-await


【解决方案1】:

从 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
    ]

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多