вызов функций синхронизации из асинхронной функции - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь перенести приложение flask на quart для использования asyncio.Я не думаю, что мой нынешний подход работает, так как вся моя цепочка функций написана без учета асинхронности - рассмотрим следующее:

def long_running_task(task):
    result = some_synchronous_function(task)
    return result

@app.route('/<task>', methods=['GET'])
async def do_task(task):
    ok = await long_running_task(task)
    if ok:
        return (ok.result)
    else:
        return ('Something went wrong')

Если long_running_task и вся его цепочка вызовов функций не объявленыкак async, получаю ли я какую-либо выгоду от того, что мой маршрут объявлен как async?

1 Ответ

0 голосов
/ 14 февраля 2019

Чтобы запустить блокирующую синхронную функцию из asyncio, не блокируя основной цикл событий, вы можете использовать loop.run_in_executor() для запуска функции блокировки в ThreadPoolExecutor или ProcessPoolExecutor `(то есть в своем собственном потоке или процессе).

Внутри асинхронной функции, из которой вы хотите вызвать ее:

loop = asyncio.get_event_loop()

result = await loop.run_in_executor(None, long_running_task, task)

Первый аргумент None это сказать ему использовать исполнителя по умолчанию для цикла.Очевидно, do_task() все еще придется ждать завершения result, но пока он ожидает, другие асинхронные задачи смогут выполняться в цикле обработки событий.

...