В моем коде у меня есть класс со свойствами, которые иногда должны запускать асинхронный код. Иногда мне нужно получить доступ к свойству из асинхронной функции, иногда из синхронной - поэтому я не хочу, чтобы мои свойства были асинхронными. Кроме того, у меня сложилось впечатление, что асинхронные свойства вообще - это запах кода. Поправь меня, если я ошибаюсь.
У меня проблема с выполнением асинхронного метода из свойства синхронного и блокированием дальнейшего выполнения до завершения асинхронного метода.
Вот пример кода:
import asyncio
async def main():
print('entering main')
synchronous_property()
print('exiting main')
def synchronous_property():
print('entering synchronous_property')
loop = asyncio.get_event_loop()
try:
# this will raise an exception, so I catch it and ignore
loop.run_until_complete(asynchronous())
except RuntimeError:
pass
print('exiting synchronous_property')
async def asynchronous():
print('entering asynchronous')
print('exiting asynchronous')
asyncio.run(main())
Его выход:
entering main
entering synchronous_property
exiting synchronous_property
exiting main
entering asynchronous
exiting asynchronous
Во-первых, захват RuntimeError
кажется неправильным, но если я этого не сделаю, я получу исключение RuntimeError: This event loop is already running
.
Во-вторых, функция asynchronous()
выполняется последней, после завершения синхронного. Я хочу выполнить некоторую обработку набора данных асинхронным методом, поэтому мне нужно дождаться его завершения.
Если я добавлю await asyncio.sleep(0)
после вызова synchronous_property()
, он позвонит asynchronous()
до окончания main()
, но это мне не поможет. Мне нужно запустить asynchronous()
до synchronous_property()
финиша.
Что мне не хватает? Я использую Python 3.7.