簡體   English   中英

從異步函數調用同步函數

[英]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()ThreadPoolExecutorProcessPoolExecutor `(即在其自己的線程或進程中)運行阻塞函數。

從你想要調用它的異步函數中:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM