新聞中心
Python線程應用程序中的提供的低級的線程控制工具有thread module,一些為了簡化多線程應用的開發(fā)程序員,用Python語言在thread的基礎上構建了一個高級的線程控制庫——threading。

成都創(chuàng)新互聯(lián)專注于江口網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供江口營銷型網(wǎng)站建設,江口網(wǎng)站制作、江口網(wǎng)頁設計、江口網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務,打造江口網(wǎng)絡公司原創(chuàng)品牌,更為您提供江口網(wǎng)站排名全網(wǎng)營銷落地服務。
在這一節(jié)中,我們將剖析threading的具體實現(xiàn)。在剖析threading的具體實現(xiàn)之前,我們先來看看threading是如何使用的。我們知道通過threading.Thread創(chuàng)建多線程,有兩個階段,第一階段是調(diào)用threading.Thread.start,而第二階段是在threading.Thread.start中調(diào)用threading.Thread.run。
當處于第一階段時,還沒有調(diào)用thread.start_new_thread創(chuàng)建原生子線程,這時候線程記錄在_limbo中。由于沒有創(chuàng)建子線程,所以現(xiàn)在沒有線程id,記錄的方式為_limbo[thread] = thread。
在第二階段,已經(jīng)成功地調(diào)用thread. start_new_thread創(chuàng)建了原生子線程,這時將從_limbo中刪除子線程,而將子線程記錄到_active中,記錄的方式為_active[thread_id] = thread??梢姟?/p>
Python這兩個dict分別維護了已經(jīng)創(chuàng)建和等待創(chuàng)建的子線程集合。對這兩個dict的訪問_active_limbo_ lock的保護之下進行。在threading module中,提供了列舉當前所有子線程的操作:threading. enumerate。這個操作很簡單,就是將_active和_limbo中維護的線程集合的信息輸出。
在thread module中,Python提供了用戶級的線程同步工具:Lock對象。而在threading module中,Python提供了不同的用于線程同步的工具。以簡化Python線程應用程序序。這些threading中的線程同步工具實際上都是建立在thread所提供的Lock對象的基礎上的。
通過調(diào)用threading.Lock,我們就可以創(chuàng)建一個thread中的Lock對象,如前面所描述的,在這個對象上,我們可以進行acquire、release等操作。在threading中的其他線程同步工具都是在這個Lock對象的基礎上,下面我們將對這些線程同步工具做一個概述性的介紹,具體的實現(xiàn)請讀者參閱threading.py。
RLock對象是Lock對象的一個變種,其內(nèi)部維護著一個Lock對象,但是它是一種可重入的Lock。一般地,對于Lock對象而言,如果一個線程連續(xù)兩次進行acquire操作。那么由于第一次acquire之后沒有release,第二次acquire將掛起線程,這將直接導致Lock對象永遠不會release,因此線程死鎖。
RLock對象允許一個線程多次對其進行acquire操作,因為在其內(nèi)部通過一個counter變量維護著線程acquire的次數(shù)。而且每一次的acquire操作必須有一個release操作與之對應,在所有的release操作都完成之后,別的線程才能申請該RLock對象。
Python線程應用程序?qū)ο笫菍ock對象的包裝,在創(chuàng)建Condition對象時,其構造函數(shù)需要一個Lock對象作為參數(shù),如果沒有這個Lock對象參數(shù),Condition將在內(nèi)部自行創(chuàng)建一個Rlock對象。
在Condition對象上,當然也可以調(diào)用acquire和release操作,因為內(nèi)部的Lock對象本身就支持這些操作。但是Condition的價值在于其提供的wait和notify的語義。假設有Condition對象C,當線程A調(diào)用C.wait()時,線程A將釋放C中的Lock對象,并進入阻塞狀態(tài)。
直到有別的線程調(diào)用C.notify(),A才會重新通過acquire申請C中的Lock對象,并退出wait操作。Semaphore對象內(nèi)部維護著一個Condition對象,對于管理一組共享資源非常有用。Lock對象可以保護一個共享資源,但是假如我們有一個共享資源池,其中有5個共享資源A。
這意味著可以有5個線程同時自由地訪問這些資源,然而如果使用Lock來對共享資源進行保護的話,所有的線程都將互斥,這使得有4個資源A被浪費了。Semaphore正是在Condition的基礎上實現(xiàn)的對共享資源池進行保護的線程同步機制。Semaphore提供了兩個操作:acquire和release,都具有與Lock相同的語義。
當線程調(diào)用Semaphore. acquire時,如果共享資源池中還有剩余的A時,線程就會繼續(xù)執(zhí)行;而如果資源池中已經(jīng)沒有任何資源存在了,線程就會將自身掛起,直到別的線程調(diào)用Semaphore.release釋放一個資源。
與Semaphore類似,Event對象實際上也是對Condition對象的一種包裝,只是提供了獨有的set和wait語義。Event類的代碼很簡單,有興趣的讀者可以參考threading.py。在thread3.py中我們看到,threading中一個關鍵的組件是threading.Thread,在這一節(jié)中我們來看一看它的具體實現(xiàn)。在threading.Thread的實現(xiàn)中,你會發(fā)現(xiàn)我們前面提到的許多機制。
新聞名稱:詳細講解Python線程應用程序操作
網(wǎng)站路徑:http://m.fisionsoft.com.cn/article/dpseseo.html


咨詢
建站咨詢
