自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對(duì)Python線(xiàn)程內(nèi)容進(jìn)行全講析

開(kāi)發(fā) 后端
下面進(jìn)行對(duì)Python線(xiàn)程內(nèi)容進(jìn)行分析研究,其中主要內(nèi)容包括,Python線(xiàn)程的定義和一些規(guī)范,接下來(lái)就為大家進(jìn)行對(duì)Python線(xiàn)程的講析。

怎么區(qū)分哪個(gè)Python線(xiàn)程對(duì)應(yīng)哪個(gè)狀態(tài)對(duì)象呢?首先考慮的是我們還有線(xiàn)程的ID。ID存儲(chǔ)的正是各個(gè)線(xiàn)程的ID,根據(jù)這些ID,就可以輕輕松松的進(jìn)行Python線(xiàn)程內(nèi)容的尋找了。

每一個(gè)線(xiàn)程對(duì)應(yīng)的線(xiàn)程狀態(tài)對(duì)象都保存著這個(gè)線(xiàn)程當(dāng)前的PyFrameObject對(duì)象,線(xiàn)程的id這樣一些信息。有時(shí)候,線(xiàn)程是需要訪問(wèn)這些信息的。比如考慮一個(gè)最簡(jiǎn)單的情形,在某種情況下。

每個(gè)線(xiàn)程都需要訪問(wèn)線(xiàn)程狀態(tài)對(duì)象中所保存的thread_id信息,顯然,線(xiàn)程A獲得的應(yīng)該是A的thread_id,線(xiàn)程B亦然。倘若線(xiàn)程A獲得的是B的thread_id,那就壞菜了。這就意味著Python內(nèi)部必須有一套機(jī)制,這套機(jī)制與操作系統(tǒng)管理進(jìn)程的機(jī)制非常類(lèi)似。

我們知道,在操作系統(tǒng)從進(jìn)程A切換到進(jìn)程B時(shí),首先會(huì)保存進(jìn)程A的上下文環(huán)境,再進(jìn)行切換;當(dāng)從進(jìn)程B切換回進(jìn)程A時(shí),又會(huì)恢復(fù)進(jìn)程A的上下文環(huán)境,這樣就保證了進(jìn)程A始終是在屬于自己的上下文環(huán)境中運(yùn)行。

這里的線(xiàn)程狀態(tài)對(duì)象就等同于進(jìn)程的上下文,Python線(xiàn)程內(nèi)容同樣會(huì)有一套存儲(chǔ)、恢復(fù)線(xiàn)程狀態(tài)對(duì)象的機(jī)制。同時(shí),在Python內(nèi)部,維護(hù)著一個(gè)全局變量:PyThreadState * _PyThread- State_Current。

當(dāng)前活動(dòng)線(xiàn)程所對(duì)應(yīng)的線(xiàn)程狀態(tài)對(duì)象就保存在這個(gè)變量里,當(dāng)Python調(diào)度線(xiàn)程時(shí),會(huì)將被激活的線(xiàn)程所對(duì)應(yīng)的線(xiàn)程狀態(tài)對(duì)象賦給_PyThreadState_Current,使其始終保存著活動(dòng)線(xiàn)程的狀態(tài)對(duì)象。

這就引出了這樣的一個(gè)問(wèn)題:Python如何在調(diào)度進(jìn)程時(shí),獲得被激活線(xiàn)程對(duì)應(yīng)的狀態(tài)對(duì)象?Python內(nèi)部會(huì)通過(guò)一個(gè)單向鏈表來(lái)管理所有的Python線(xiàn)程的狀態(tài)對(duì)象。當(dāng)需要尋找一個(gè)線(xiàn)程對(duì)應(yīng)的狀態(tài)對(duì)象時(shí),就遍歷這個(gè)鏈表,搜索其對(duì)應(yīng)的狀態(tài)對(duì)象。在此后的描述中,我們將這個(gè)鏈表稱(chēng)為“狀態(tài)對(duì)象鏈表”。

下面我們來(lái)看一看實(shí)現(xiàn)這個(gè)機(jī)制的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。PyThread_create_key將創(chuàng)建一個(gè)新的key。注意,這里的key都是一個(gè)整數(shù)。而且,當(dāng)PyThread_create_key***次被調(diào)用時(shí)(在_PyGILState_Init中的調(diào)用正是***次調(diào)用),會(huì)通過(guò)PyThread_allcate_lock創(chuàng)建一個(gè)keymutex。

根據(jù)我們前面的分析,這個(gè)keymutex實(shí)際上和GIL一樣,都是一個(gè)PNRMUTEX結(jié)構(gòu)體,而在這個(gè)結(jié)構(gòu)體中,維護(hù)著一個(gè)Win32下的Event內(nèi)核對(duì)象。這個(gè)keymutex的功能就是用來(lái)互斥對(duì)狀態(tài)對(duì)象鏈表的訪問(wèn)。

在_PyGILState_Init中,創(chuàng)建的新key被Python維護(hù)的全局變量autoTLSkey接收,其中的TLS是Thread Local Store的縮寫(xiě)。這個(gè)autoTLSkey將用作Python保存所有線(xiàn)程的狀態(tài)對(duì)象的一個(gè)參數(shù),即是圖15-6中的key值。也就是說(shuō),狀態(tài)對(duì)象列表中所有key結(jié)構(gòu)體中的key值都會(huì)是autoTLSkey。

哎,那位看官說(shuō)了,你看PyThread_create_key返回的是nkeys的遞增后的值啊,就是說(shuō)每create一次,得到的結(jié)果都是不同的,怎么能說(shuō)所有的key都是一樣的呢?事實(shí)上,在整個(gè)Python的源碼中,PyThread_create_key只在_PyGILState_Init中被調(diào)用了,而這個(gè)_PyGILState_Init只會(huì)在Python運(yùn)行時(shí)環(huán)境初始化時(shí)調(diào)用一次。

Python主界面

雖然這個(gè)核心函數(shù)的名字叫find_key,然而我們可以看到,它的作用并不僅僅是搜索,而且還包含了創(chuàng)建的動(dòng)作。在代碼清單15-3的[2]處,find_key會(huì)遍歷狀態(tài)對(duì)象列表,搜索key和id都匹配的key結(jié)構(gòu)體。

如果搜索成功,則直接返回;而當(dāng)搜索失敗時(shí),find_key會(huì)在代碼清單15-3的[3]處創(chuàng)建一個(gè)新的key結(jié)構(gòu)體,并設(shè)置其中的id,key和value,***將其插入到狀態(tài)對(duì)象列表的頭部。

在代碼清單15-3的[1]和[4]處我們看到了Python確實(shí)通過(guò)在_PyGILState_Init中創(chuàng)建的keymutex來(lái)互斥對(duì)狀態(tài)對(duì)象列表的訪問(wèn)。在了解了這個(gè)核心函數(shù)之后,Python線(xiàn)程內(nèi)容為狀態(tài)對(duì)象列表所提供的接口就顯得非常清晰了。其實(shí),就是簡(jiǎn)單的鏈表的插入、刪除和查詢(xún)操作。

【編輯推薦】

  1. 漫談Python 源代碼編制技巧
  2. 簡(jiǎn)單易于操作的Python 工具詳解
  3. 有關(guān)Python應(yīng)用領(lǐng)域進(jìn)行說(shuō)明介紹
  4. PythonAndroid面向?qū)ο蟮木幊獭狿ython應(yīng)用程序
  5. 如何使用Python模塊解析配置文件 ?
責(zé)任編輯:chenqingxiang 來(lái)源: CSDN
相關(guān)推薦

2010-02-22 11:02:55

Python功能

2009-12-09 09:49:56

VS .NET 200

2010-02-04 16:43:18

Android 配置問(wèn)

2010-02-04 13:43:20

Android操作系統(tǒng)

2010-02-22 10:18:29

Python代碼

2010-03-01 14:28:46

Python進(jìn)程

2010-01-20 11:02:42

C++開(kāi)發(fā)環(huán)境

2009-09-24 12:50:23

Hibernate F

2009-12-25 16:46:48

ADO調(diào)用存儲(chǔ)過(guò)程

2010-01-05 15:48:51

JQuery緩存

2010-03-18 15:57:07

太網(wǎng)交換機(jī)

2010-02-23 15:29:43

Python 編輯器

2010-03-03 14:51:02

Android手機(jī)

2010-02-26 09:42:52

Python線(xiàn)程池

2009-12-08 17:08:13

WCF Service

2010-03-04 16:38:37

Android開(kāi)發(fā)技巧

2010-02-05 15:22:14

2010-01-14 09:27:44

C++語(yǔ)言

2010-02-07 10:21:27

Android應(yīng)用程序

2010-09-16 12:02:44

vpdn pppoe配
點(diǎn)贊
收藏

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