創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
10年積累的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有沭陽(yáng)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。這篇文章主要介紹Python進(jìn)行線程切換的方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
線程切換
條件對(duì)象能讓一個(gè)線程 A 停下來(lái),等待其他線程 B ,線程 B 滿足了某個(gè)條件后通知(notify)線程 A 繼續(xù)運(yùn)行。線程首先獲取一個(gè)條件變量鎖,如果條件不足,則該線程等待(wait)并釋放條件變量鎖,如果滿足就執(zhí)行線程,也可以通知其他狀態(tài)為 wait 的線程。其他處于 wait 狀態(tài)的線程接到通知后會(huì)重新判斷條件。
無(wú)論是多進(jìn)程還是多線程,只要數(shù)量一多,效率肯定上不去,為什么呢?我們打個(gè)比方,假設(shè)你不幸正在準(zhǔn)備中考,每天晚上需要做語(yǔ)文、數(shù)學(xué)、英語(yǔ)、物理、化學(xué)這5科的作業(yè),每項(xiàng)作業(yè)耗時(shí)1小時(shí)。
如果你先花1小時(shí)做語(yǔ)文作業(yè),做完了,再花1小時(shí)做數(shù)學(xué)作業(yè),這樣,依次全部做完,一共花5小時(shí),這種方式稱為單任務(wù)模型,或者批處理任務(wù)模型。
假設(shè)你打算切換到多任務(wù)模型,可以先做1分鐘語(yǔ)文,再切換到數(shù)學(xué)作業(yè),做1分鐘,再切換到英語(yǔ),以此類推,只要切換速度足夠快,這種方式就和單核CPU執(zhí)行多任務(wù)是一樣的了,以幼兒園小朋友的眼光來(lái)看,你就正在同時(shí)寫5科作業(yè)。
但是,切換作業(yè)是有代價(jià)的,比如從語(yǔ)文切到數(shù)學(xué),要先收拾桌子上的語(yǔ)文書本、鋼筆(這叫保存現(xiàn)場(chǎng)),然后,打開(kāi)數(shù)學(xué)課本、找出圓規(guī)直尺(這叫準(zhǔn)備新環(huán)境),才能開(kāi)始做數(shù)學(xué)作業(yè)。操作系統(tǒng)在切換進(jìn)程或者線程時(shí)也是一樣的,它需要先保存當(dāng)前執(zhí)行的現(xiàn)場(chǎng)環(huán)境(CPU寄存器狀態(tài)、內(nèi)存頁(yè)等),然后,把新任務(wù)的執(zhí)行環(huán)境準(zhǔn)備好(恢復(fù)上次的寄存器狀態(tài),切換內(nèi)存頁(yè)等),才能開(kāi)始執(zhí)行。這個(gè)切換過(guò)程雖然很快,但是也需要耗費(fèi)時(shí)間。如果有幾千個(gè)任務(wù)同時(shí)進(jìn)行,操作系統(tǒng)可能就主要忙著切換任務(wù),根本沒(méi)有多少時(shí)間去執(zhí)行任務(wù)了,這種情況最常見(jiàn)的就是硬盤狂響,點(diǎn)窗口無(wú)反應(yīng),系統(tǒng)處于假死狀態(tài)。
所以,多任務(wù)一旦多到一個(gè)限度,就會(huì)消耗掉系統(tǒng)所有的資源,結(jié)果效率急劇下降,所有任務(wù)都做不好。
下面為一個(gè)有趣的例子
import threading class Boy(threading.Thread): def __init__(self, cond, name): super(Boy, self).__init__() self.cond = cond self.name = name def run(self): self.cond.acquire() print(self.name + ": 嫁給我吧?。?) self.cond.notify() # 喚醒一個(gè)掛起的線程,讓hanmeimei表態(tài) self.cond.wait() # 釋放內(nèi)部所占用的瑣,同時(shí)線程被掛起,直至接收到通知被喚醒或超時(shí),等待hanmeimei回答 print(self.name + ": 我單下跪,送上戒指!") self.cond.notify() self.cond.wait() print(self.name + ": Li太太,你的選擇太明治了。") self.cond.release() class Girl(threading.Thread): def __init__(self, cond, name): super(Girl, self).__init__() self.cond = cond self.name = name def run(self): self.cond.acquire() self.cond.wait() # 等待Lilei求婚 print(self.name + ": 沒(méi)有情調(diào),不夠浪漫,不答應(yīng)") self.cond.notify() self.cond.wait() print(self.name + ": 好吧,答應(yīng)你了") self.cond.notify() self.cond.release() cond = threading.Condition() boy = Boy(cond, "LiLei") girl = Girl(cond, "HanMeiMei") girl.start() boy.start()
運(yùn)行結(jié)果如下:
LiLei: 嫁給我吧??? HanMeiMei: 沒(méi)有情調(diào),不夠浪漫,不答應(yīng) LiLei: 我單下跪,送上戒指! HanMeiMei: 好吧,答應(yīng)你了 LiLei: Li太太,你的選擇太明治了。
以上是Python進(jìn)行線程切換的方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!