从异步函数调用同步函数

时间:2019-02-14 07:30:25

标签: 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')

如果long_running_task及其整个函数调用链未声明为async,那么我的路由被声明为async真的可以从中受益吗?

1 个答案:

答案 0 :(得分:1)

要从asyncio运行阻塞同步功能而不阻塞主事件循环,可以使用loop.run_in_executor()ThreadPoolExecutorProcessPoolExecutor`(即在其{自己的线程或进程)。

要在异步函数中从以下位置调用它:

loop = asyncio.get_event_loop()

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

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