[英]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.