Блокировка результата метода async в обычном (sync) методе - PullRequest
1 голос
/ 07 марта 2019

Скажем, в моем алгоритме есть асинхронное ядро, которое означает для возврата окончательного результата.

И некоторые части синхронизации, которые должны выполняться до и после. Как:

async def algo_async(x):
    await ...
    return result
def run():
    x = prepare()
    r = ???(algo_async(x)) #< What here?
    post(r)

1 Ответ

1 голос
/ 07 марта 2019

Асинхронная функция может (и должна) запускаться циклом событий , например:

def run():
    x = prepare()
    r = asyncio.run(algo_async(x))
    post(r)

(Если у вас Python <3.7, используйте <code>asyncio.get_event_loop().run_until_complete(algo_async(x)) вместо asyncio.run)


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

Именно поэтому обычно люди делают цикл обработки событий точкой входа всей программы и используют все функции, которые должны запускать асинхронную функцию, также асинхронно..

...