簡體   English   中英

Python asyncio - 如果 function 被調用沒有返回值,如何使用

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

問題:

  1. 我不知道在do_diff function 中將await放在哪里。 但是沒有它,代碼似乎也可以工作。
  2. 我不確定這些差異是否真的並行發生,因為當我在另一個終端中查看ps -eaf的 output 時,我一次只看到一個我正在調用的底層工具的實例。
  3. 執行速度與我按順序執行差異時相同

所以我顯然做錯了什么。 我怎樣才能真正並行地做差異?

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.

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