1 回答

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