Вызовите асинхронную функцию из функции синхронизации, пока синхронная функция продолжается: Python - PullRequest
1 голос
/ 12 апреля 2019

После просмотра множества документов по AsyncIO и статей я все еще не мог найти ответ на этот вопрос: Запуск функции асинхронно (без использования потока), а также обеспечение продолжения работы функции, вызывающей эту асинхронную функцию. исполнение.

Псевдокод:

async def functionAsync(p):
    #...
    #perform intensive calculations
    #...
    print ("Async loop done")

def functionNormal():
    p = ""
    functionA(p)
    return ("Main loop ended")

 print ("Start Code")
 print functionNormal()

Ожидаемый результат:

Start code
Main loop ended
Async loop done

Искать примеры, где используется loop.run_until_complete, но это не вернет значение печати functionNormal(), поскольку оно по своей природе блокирует.

1 Ответ

0 голосов
/ 12 апреля 2019

asyncio не может запускать произвольный код "в фоновом режиме" без использования потоков. Поскольку user4815162342 отмечено как asyncio, вы запускаете цикл обработки событий, который блокирует основной поток и управляет выполнением сопрограмм.

Если вы хотите использовать asyncio и воспользоваться его преимуществами, вам следует переписать все ваши функции, которые используют сопрограммы, чтобы они были сопрограммами, либо до основной функции - точки входа вашей программы. Эта основная сопрограмма обычно передается на run_until_complete. Этот небольшой пост раскрывает эту тему более подробно.


Поскольку вы заинтересованы в Flask, взгляните Quart : это веб-фреймворк, который пытается реализовать Flask API (насколько это возможно) с точки зрения asyncio. Причина, по которой этот проект существует, заключается в том, что чистый Flask не совместим с asyncio. Кварта написана для совместимости.

Если вы хотите остаться с чистым Flask, но у вас есть асинхронный материал, взгляните на gevent . Благодаря патчированию обезьяны это может сделать ваш код асинхронным. Хотя у этого решения есть свои проблемы (именно поэтому был создан asyncio).

...