[英]Python asyncio - how to use if function being called has nothing to return
我有 200 對不同的路徑。 我寫了一點 function,它將區分每一對並更新一個字典,該字典本身是 arguments 到 function 之一。 假設MY_DIFFER
是我通過subprocess
進程調用的一些差異化工具。
async def do_diff(path1, path2, result):
result[f"{path1} {path2}"] = MY_DIFFER(path1, path2)
正如你所看到的,我沒有從這個異步 function 中返回。 我只是在 result 中捕獲result
。
我在其他地方使用 asyncio 並行調用此 function,如下所示:
path_tuples = [("/path11", "/path12"), ("/path21", "/path22"), ... ]
result = {}
loop = asyncio.get_event_loop()
loop.run_until_complete(
asyncio.gather(
*(do_diff(path1, path2, result) for path1, path2 in path_tuples)
)
)
問題:
do_diff
function 中將await
放在哪里。 但是沒有它,代碼似乎也可以工作。ps -eaf
的 output 時,我一次只看到一個我正在調用的底層工具的實例。所以我顯然做錯了什么。 我怎樣才能真正並行地做差異?
PS:我在Python 3.6
請記住,asyncio 不會並行運行事物,它使用協作多任務 model並行運行事物 - 這意味着協程需要顯式地讓其他協程運行它們的時間。 這就是await
命令的作用; 它說“在我等待完成的時候去運行一些其他的協程”。
如果您從不awaiting
某事,那么您就不會獲得並發執行。
你想要的是讓你的do_diff
方法能夠await
你的外部工具的執行,但你不能只使用subprocess
模塊來做到這一點。 您可以使用run_in_executor
方法來做到這一點,該方法安排在單獨的線程或進程中運行同步命令(例如subprocess.run
)並異步等待結果。 這可能看起來像:
async def do_diff(path1, path2, result):
loop = asyncio.get_event_loop()
result[f"{path1} {path2}"] = await loop.run_in_executor(None, MY_DIFFER, path1, path2)
默認情況下,這將在單獨的線程中運行MY_DIFFER
,盡管您可以通過將顯式執行程序作為第一個參數傳遞給run_in_executor
來使用單獨的進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.