[英]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()
在ThreadPoolExecutor
或ProcessPoolExecutor
`(即在其自己的线程或进程中)运行阻塞函数。
从你想要调用它的异步函数中:
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, long_running_task, task)
第一个参数None
是告诉它使用循环的默认执行器。 显然do_task()
仍然需要等待result
完成,但在等待期间,其他异步任务将能够在事件循环中运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.