#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».