第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

python asyncio as_completed的疑惑

python asyncio as_completed的疑惑

慕無(wú)忌1623718 2024-01-27 15:28:39
在閱讀了相當(dāng)多關(guān)于 asyncio 的內(nèi)容之后(我對(duì)它完全是菜鳥(niǎo)),我已經(jīng)成功編寫了一些簡(jiǎn)單的程序來(lái)完成我想要它們做的事情。然而,我對(duì) as_completed 方法有一些疑問(wèn):它的內(nèi)部工作原理以及它如何影響我的 CPU 使用率。因此,讓有以下片段:#as_completed_example.pyimport asyncioimport tqdmimport datetimeimport sysimport signalimport random#--------------------------------------------------------------------------------------async def heavy_load(i):    #tqdm.tqdm.write('#DEBUG    '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' '+str(i))    await asyncio.sleep(random.random())    return None#--------------------------------------------------------------------------------------async def main():    length  =   int(sys.argv[1])    inputs  =   list(range(length))    pbar    =   tqdm.tqdm(total=len(inputs),position=0,leave=True,bar_format='#PROGRESS {desc}: {percentage:.3f}%|{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}')    tasks   =   [heavy_load(i) for i in inputs]    for future in asyncio.as_completed(tasks):        _ = await future        pbar.update(1)        pbar.refresh()            #---------------------------------------------------------------------------    def sigint_handler(signum,frame):    tqdm.tqdm.write('#INFO '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' user aborted execution!')    sys.exit(0)#---------------------------------------------------------------------------    if(__name__=='__main__'):    signal.signal(signal.SIGINT,sigint_handler)    asyncio.run(main())     如果我將其稱為 python3 as_completed_example.py 1000,它會(huì)完美地工作。然而,如果我將其稱為as_completed_example.py 1000000 (large number),我會(huì)觀察到我的進(jìn)度條在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi)卡在 0% :-雖然我的進(jìn)度條為 0%,--我的 CPU 發(fā)生了什么?因?yàn)樾枰粋€(gè)核心才能達(dá)到 100% 使用率-為什么我future在相當(dāng)長(zhǎng)一段時(shí)間后沒(méi)有從 as_completed得到任何信息?
查看完整描述

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ì)列,并將它們從setfuture 中刪除,這些都不是免費(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)行。


查看完整回答
反對(duì) 回復(fù) 2024-01-27
  • 1 回答
  • 0 關(guān)注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)