Скажем, у меня есть основной цикл, ожидающий сообщения веб-сокета и обрабатывающий его, я также хочу, чтобы неблокирующая сопрограмма сердцебиения проверяла состояние соединения, проверяя его и пропуская основной цикл всякий раз, когда возникает исключение.
Мне интересно, как лучше всего это сделать.
Вот моя абстрактная реализация этой концепции, я не знаю, является ли это наиболее надежным или эффективным способом сделать это.
Есть предложения?
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())