我正在尝试将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
真的可以从中受益吗?
答案 0 :(得分:1)
要从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
完成,但是在等待时,其他异步任务将能够在事件循环中运行。