Как переписать последовательные операторы async with в цикл? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующий отрывок, который отлично работает во всех отношениях, за исключением того, что он требует, чтобы я знал, сколько WebSockets я планирую открыть заранее.

Если вместо этого я начал со списка хостов и должен был создатьN соединений WebSocket, как я могу выполнить то, что этот код делает для 3 веб-сокетов (через '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)

1 Ответ

0 голосов
/ 21 апреля 2019

Начиная с Python3.7, в модуле contextlib доступно AsyncExitStack , вот как его можно использовать для вашей проблемы:

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
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...