Декоратор для асинхронного метода в классе, который должен периодически запускаться

#python #async-await #python-asyncio

Вопрос:

Я пытаюсь научиться асинхронности и ждать. Я попытался написать декоратор для асинхронного метода класса, который должен периодически запускаться после оформления (т. Е. Декоратор-это то, что должно периодически его запускать). Вот мой код:

 import asyncio
import functools

def loop(interval):
    def decorator(coroutine):
        @functools.wraps(coroutine)
        async def inner(*args):
            while True:
                await coroutine(*args)
                await asyncio.sleep(interval)
        return inner
    return decorator

class A:
    def __init__(self, a):
        self.a = a

    @loop(interval = 2)
    async def periodic_update(self):
        # Some awaits here...
        print(self.a)

a = A(42)
b = A(53)

async def f(l, m):
    await l.periodic_update()
    await m.periodic_update()

asyncio.run(f(a, b))

 

Я ожидал, что и 42, и 53 будут печататься с регулярными интервалами в 2 секунды, но этого не происходит, и я вижу, что печатается только 42. Почему? Что я делаю не так?

Комментарии:

1. Если вы ожидаете входа periodic_update , первый вызов periodic_update никогда не завершится, поэтому ожидание m.periodic_update() не будет выполняться. Вместо этого вы хотели бы сделать что-то вроде создания задач, а затем запускать их одновременно. Код здесь выглядит так, как будто вы заставляете асинхронный код выполняться синхронно.

2. @Carcigenicate Спасибо, это, кажется, делает то, что я хочу. Я прочитаю об этом подробнее…

3. Я признаю, что мои знания asyncio Python минимальны, но я имел asyncio.gather в виду: «Одновременно запускайте ожидаемые объекты в последовательности aws».