从异步函数调用同步函数
calling sync functions from async function
我正在尝试将 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
的路由中获得任何好处?
为了 运行 来自 asyncio 的阻塞同步函数,在不阻塞主事件循环的情况下,您可以使用 loop.run_in_executor()
to run the blocking function in a ThreadPoolExecutor
or ProcessPoolExecutor
`(即在它自己的线程或进程中)。
从异步函数中调用它:
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, long_running_task, task)
第一个参数None
是告诉它使用循环的默认执行器。显然 do_task()
仍然需要等待 result
完成,但在等待期间,其他异步任务将能够 运行 在事件循环中。
我正在尝试将 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
的路由中获得任何好处?
为了 运行 来自 asyncio 的阻塞同步函数,在不阻塞主事件循环的情况下,您可以使用 loop.run_in_executor()
to run the blocking function in a ThreadPoolExecutor
or ProcessPoolExecutor
`(即在它自己的线程或进程中)。
从异步函数中调用它:
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, long_running_task, task)
第一个参数None
是告诉它使用循环的默认执行器。显然 do_task()
仍然需要等待 result
完成,但在等待期间,其他异步任务将能够 运行 在事件循环中。