1 回答

TA貢獻1858條經驗 獲得超8個贊
這里有幾個問題,如果可能的話應該避免。但對于你的前兩個問題有一個簡單的答案。為什么它固定單個CPU,為什么在打印進度條之前有延遲?有很多單線程工作要做。
asyncio
在單個線程中運行所有內容,除非您明確這樣做。您正在構建的任務需要在 內部進行大量設置asyncio
,尤其是對as_completed
.?但它必須:
創造
set
你的未來。不太貴,但不是免費的。設置生產者和消費者隊列來控制尚未運行的任務和已完成的任務。對于您正在使用的如此大量的任務,這可能會導致多次、大量的分配,這可能是一個真正的殺手。
安排回調在 future 完成時運行。這主要是將它們從隊列移動到另一個隊列,并將它們從
set
future 中刪除,這些都不是免費的。成就每一個未來
事實上,這里有很多設置,并且這需要相當多的時間,通過改變輸入的大小可以很容易地看到這一點。在我的筆記本電腦上,運行任何期貨之前的時間確實從 size 開始急劇下降100000
。此外,它會非線性下降,這表明這個大小對于我的機器上的內存層次結構特別不利(例如,在這個大小之后,會有更多的緩存未命中)。
asyncio
我還發現事件循環的解析可能在這里發揮了作用。期貨的消耗必須經過一定的時間。您正在創建許多 future,其中許多幾乎是在事件循環的單個滴答內同時完成的(正如 @user4815162342 在評論中正確指出的那樣)。事件循環的每個周期都有大量工作,并且必須全部在單個線程上完成。
考慮到整個事情需要超過 1 秒才能完成這一事實,這一點非常清楚。最大睡眠間隔為 1 秒,因為random.random
為您提供了 上的值[0, 1.0)
,但整個應用程序需要更長的時間。因此,這里正在進行的工作不僅僅是“一秒鐘的價值”,而且全部都在一個線程中進行。
添加回答
舉報