Неблокирующее асинхронное сердцебиение для проверки работоспособности и остановки основного цикла при исключении - PullRequest
0 голосов
/ 05 октября 2018

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

Мне интересно, как лучше всего это сделать.

Вот моя абстрактная реализация этой концепции, я не знаю, является ли это наиболее надежным или эффективным способом сделать это.

Есть предложения?

import asyncio
import logging
import random
logging.basicConfig(level=10, format="%(asctime)s %(threadName)s %(name)s.%(funcName)s [%(levelname)s]: %(message)s")
logger = logging.getLogger()


async def heart_beat():
    logger.info('heart beat...')
    await asyncio.sleep(10)  # so this task will run roughly every 10s
    return 10/random.randint(0, 10)  # this task has 1/10 chance of failing


async def main_loop():
    fut = asyncio.ensure_future(heart_beat())
    while True:
        if fut.done():
            ret = await fut  # if finished, get result, if error, which will be raised here
            logger.info(f'result from heart beat {ret}...')
            fut = asyncio.ensure_future(heart_beat())  # spawn another heart beat

        logger.info('new message...')
        await asyncio.sleep(1)  # resembles await functions that gets messages from ws


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main_loop())
...