偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

詳細(xì)講解Python線程應(yīng)用程序操作

開(kāi)發(fā) 后端
在進(jìn)行調(diào)用Python線程應(yīng)用程序時(shí),會(huì)在_limbo中記錄線程,然后通過(guò)thread.start_new_thread創(chuàng)建原生線程,把線程創(chuàng)建的過(guò)程為bootstrap。

Python線程應(yīng)用程序中的提供的低級(jí)的線程控制工具有thread module,一些為了簡(jiǎn)化多線程應(yīng)用的開(kāi)發(fā)程序員,用Python語(yǔ)言在thread的基礎(chǔ)上構(gòu)建了一個(gè)高級(jí)的線程控制庫(kù)——threading。

在這一節(jié)中,我們將剖析threading的具體實(shí)現(xiàn)。在剖析threading的具體實(shí)現(xiàn)之前,我們先來(lái)看看threading是如何使用的。我們知道通過(guò)threading.Thread創(chuàng)建多線程,有兩個(gè)階段,第一階段是調(diào)用threading.Thread.start,而第二階段是在threading.Thread.start中調(diào)用threading.Thread.run。

當(dāng)處于第一階段時(shí),還沒(méi)有調(diào)用thread.start_new_thread創(chuàng)建原生子線程,這時(shí)候線程記錄在_limbo中。由于沒(méi)有創(chuàng)建子線程,所以現(xiàn)在沒(méi)有線程id,記錄的方式為_(kāi)limbo[thread] = thread。

在第二階段,已經(jīng)成功地調(diào)用thread. start_new_thread創(chuàng)建了原生子線程,這時(shí)將從_limbo中刪除子線程,而將子線程記錄到_active中,記錄的方式為_(kāi)active[thread_id] = thread。可見(jiàn)。

Python這兩個(gè)dict分別維護(hù)了已經(jīng)創(chuàng)建和等待創(chuàng)建的子線程集合。對(duì)這兩個(gè)dict的訪問(wèn)_active_limbo_ lock的保護(hù)之下進(jìn)行。在threading module中,提供了列舉當(dāng)前所有子線程的操作:threading. enumerate。這個(gè)操作很簡(jiǎn)單,就是將_active和_limbo中維護(hù)的線程集合的信息輸出。

在thread module中,Python提供了用戶級(jí)的線程同步工具:Lock對(duì)象。而在threading module中,Python提供了不同的用于線程同步的工具。以簡(jiǎn)化Python線程應(yīng)用程序序。這些threading中的線程同步工具實(shí)際上都是建立在thread所提供的Lock對(duì)象的基礎(chǔ)上的。

通過(guò)調(diào)用threading.Lock,我們就可以創(chuàng)建一個(gè)thread中的Lock對(duì)象,如前面所描述的,在這個(gè)對(duì)象上,我們可以進(jìn)行acquire、release等操作。在threading中的其他線程同步工具都是在這個(gè)Lock對(duì)象的基礎(chǔ)上,下面我們將對(duì)這些線程同步工具做一個(gè)概述性的介紹,具體的實(shí)現(xiàn)請(qǐng)讀者參閱threading.py。

RLock對(duì)象是Lock對(duì)象的一個(gè)變種,其內(nèi)部維護(hù)著一個(gè)Lock對(duì)象,但是它是一種可重入的Lock。一般地,對(duì)于Lock對(duì)象而言,如果一個(gè)線程連續(xù)兩次進(jìn)行acquire操作。那么由于第一次acquire之后沒(méi)有release,第二次acquire將掛起線程,這將直接導(dǎo)致Lock對(duì)象永遠(yuǎn)不會(huì)release,因此線程死鎖。

RLock對(duì)象允許一個(gè)線程多次對(duì)其進(jìn)行acquire操作,因?yàn)樵谄鋬?nèi)部通過(guò)一個(gè)counter變量維護(hù)著線程acquire的次數(shù)。而且每一次的acquire操作必須有一個(gè)release操作與之對(duì)應(yīng),在所有的release操作都完成之后,別的線程才能申請(qǐng)?jiān)揜Lock對(duì)象。

Python線程應(yīng)用程序對(duì)象是對(duì)Lock對(duì)象的包裝,在創(chuàng)建Condition對(duì)象時(shí),其構(gòu)造函數(shù)需要一個(gè)Lock對(duì)象作為參數(shù),如果沒(méi)有這個(gè)Lock對(duì)象參數(shù),Condition將在內(nèi)部自行創(chuàng)建一個(gè)Rlock對(duì)象。

在Condition對(duì)象上,當(dāng)然也可以調(diào)用acquire和release操作,因?yàn)閮?nèi)部的Lock對(duì)象本身就支持這些操作。但是Condition的價(jià)值在于其提供的wait和notify的語(yǔ)義。假設(shè)有Condition對(duì)象C,當(dāng)線程A調(diào)用C.wait()時(shí),線程A將釋放C中的Lock對(duì)象,并進(jìn)入阻塞狀態(tài)。

直到有別的線程調(diào)用C.notify(),A才會(huì)重新通過(guò)acquire申請(qǐng)C中的Lock對(duì)象,并退出wait操作。Semaphore對(duì)象內(nèi)部維護(hù)著一個(gè)Condition對(duì)象,對(duì)于管理一組共享資源非常有用。Lock對(duì)象可以保護(hù)一個(gè)共享資源,但是假如我們有一個(gè)共享資源池,其中有5個(gè)共享資源A。

這意味著可以有5個(gè)線程同時(shí)自由地訪問(wèn)這些資源,然而如果使用Lock來(lái)對(duì)共享資源進(jìn)行保護(hù)的話,所有的線程都將互斥,這使得有4個(gè)資源A被浪費(fèi)了。Semaphore正是在Condition的基礎(chǔ)上實(shí)現(xiàn)的對(duì)共享資源池進(jìn)行保護(hù)的線程同步機(jī)制。Semaphore提供了兩個(gè)操作:acquire和release,都具有與Lock相同的語(yǔ)義。

當(dāng)線程調(diào)用Semaphore. acquire時(shí),如果共享資源池中還有剩余的A時(shí),線程就會(huì)繼續(xù)執(zhí)行;而如果資源池中已經(jīng)沒(méi)有任何資源存在了,線程就會(huì)將自身掛起,直到別的線程調(diào)用Semaphore.release釋放一個(gè)資源。

與Semaphore類(lèi)似,Event對(duì)象實(shí)際上也是對(duì)Condition對(duì)象的一種包裝,只是提供了獨(dú)有的set和wait語(yǔ)義。Event類(lèi)的代碼很簡(jiǎn)單,有興趣的讀者可以參考threading.py。在thread3.py中我們看到,threading中一個(gè)關(guān)鍵的組件是threading.Thread,在這一節(jié)中我們來(lái)看一看它的具體實(shí)現(xiàn)。在threading.Thread的實(shí)現(xiàn)中,你會(huì)發(fā)現(xiàn)我們前面提到的許多機(jī)制。

【編輯推薦】

  1. 有關(guān)Python系統(tǒng)文件進(jìn)行介紹指導(dǎo)
  2. 如何正確的使用Python函數(shù)
  3. 對(duì)Python 構(gòu)建工具進(jìn)行詳細(xì)介紹分析
  4. PythonAndroid淺析Python優(yōu)勢(shì)所在
  5. 如何使用Python模塊解析配置文件?
責(zé)任編輯:chenqingxiang 來(lái)源: 博客園
相關(guān)推薦

2009-09-27 17:23:16

Hibernate應(yīng)用

2009-10-10 13:56:44

IIS應(yīng)用程序VB開(kāi)發(fā)

2009-10-27 12:20:06

VB.NET多線程應(yīng)用

2011-07-20 15:58:58

iPhone 應(yīng)用程序 生命周期

2009-12-25 10:39:49

WPF應(yīng)用程序關(guān)閉

2010-03-03 17:56:44

Android應(yīng)用程序

2011-07-26 11:13:15

iPhone PXL

2021-09-26 08:30:31

Python應(yīng)用程序代碼

2009-12-21 11:22:37

Linux網(wǎng)絡(luò)操作命令

2011-07-19 11:12:07

iPhone 控制器

2011-07-19 10:42:41

iPhone 應(yīng)用程序 模型

2011-07-19 10:56:15

iPhone 控制器 視圖

2010-02-01 14:05:03

2010-02-22 17:46:57

Python應(yīng)用程序

2011-12-07 12:01:31

ibmdw

2010-02-02 15:37:11

2010-02-26 11:08:29

Python應(yīng)用程序

2024-06-24 10:53:23

2009-10-09 17:01:32

VB.NET多線程

2011-07-12 10:59:41

JAVA多線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)