Найти - Пользователи
Полная версия: Вставить в асинхронный цикл код, чтобы он работал по времени
Начало » Python для новичков » Вставить в асинхронный цикл код, чтобы он работал по времени
1
robisho
Добрый день. Задача такая: есть асинхронная фунция, в которой идет работа с websocket. Сначала рукопожатие, потом отправка необходимых данных. В цикле осуществляется ожидание данных. Но для сохранения коннекта нужно посылать каждые 5 сек пинг вне зависимости от прихода данных. Т.е. в основном цикле должен быть еще один безконечный цикл, в котором через 5 сек будет посылаться пинг и этот вложенный цикл должен жить отдельной жизнью от основного цикла. Подскажите, пожалуйста, как это можно сделать? Спасибо.

 async def run_websockets():
    uri = "wss://site.ru/socket.io/?EIO=3&transport=websocket"
    async with websockets.connect(uri, subprotocols=["websocket"], extra_headers=extra_headers) as ws:
        greeting = await ws.recv()
        print(f'greeting >>> {greeting}')
        print('=== greeting ===')
        message = await ws.recv()
        await ws.send("broadcast1")
        await ws.send("observer2")
        message = await ws.recv()
        # в этом цикле необходимо реализовать идею с пингом
        while True:
            try:
                message = await ws.recv()
            except websockets.exceptions.ConnectionClosedError:
                print('*** ConnectionClosedError ***')
DamMercul
Можешь отдельно сделать поток, который будет обособлен от основного цикла и самостоятельно посылать сообщения:
 from threading import Thread
from time import sleep
THREAD_STATUS = True
def keepalive(connection):
    while THREAD_STATUS:
        connection.send(b"XXX")
        sleep(5)
Не работал с вебсокетами особо, модуля не знаю, но внутри await подключи этот поток и дай ему соединение в аргументах, а когда основной цикл завершится, то THREAD_STATUS сделай False, и поток умрет
doza_and
DamMercul
Можешь отдельно сделать поток, который будет обособлен от основного цикла
Конечно можно… Но это так не асинхронно!!! Выглядит как скрещивание ужа с ежом.
Во первых для пинга лучше дождаться соединения. “async with websockets.connect” , создать асинхронную задачу
примерно вот такую https://docs.python.org/3/library/asyncio-task.html#sleeping
, и поставить ее на выполнение
https://docs.python.org/3/library/asyncio-future.html#asyncio.ensure_future
.
Очевидно при закрытии соединения надо задачу пинга завершить https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.cancel.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB