从异步函数调用同步函数

chr*_*ris 10 python python-asyncio quart

我正在尝试将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')
Run Code Online (Sandbox Code Playgroud)

如果long_running_task和它的整个函数调用链都没有声明为async,我是否真的从我的路由被声明为中得到任何好处async?

J. *_*lor 14

要从 asyncio 运行阻塞同步函数,而不阻塞主事件循环,您可以使用loop.run_in_executor()在 aThreadPoolExecutor或ProcessPoolExecutor`(即在其自己的线程或进程中)运行阻塞函数。

从你想要调用它的异步函数中:

loop = asyncio.get_event_loop()

result = await loop.run_in_executor(None, long_running_task, task)
Run Code Online (Sandbox Code Playgroud)

第一个参数None是告诉它使用循环的默认执行器。显然do_task()仍然需要等待result完成,但是在等待期间,其他异步任务将能够在事件循环中运行。