成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python主線程問題進行研究討論

開發 后端
Python主線程具有非常簡捷而清晰的語法特點,適合完成各種高層任務,幾乎可以在所有的操作系統中運行。

Python主線程的問題這里我想在重申一下,對于那些從來沒有學習過編程或者并非計算機專業的編程學習者而言,Python是***的選擇之一,下面文章進行學習介紹。

PyThread_acquire_lock有兩種工作方式,通過函數參數waitflag來區分。這個waitflag指示當GIL當前不可獲得時。是否進行等待,更直接地說,就是當前線程是否通過WaitForSingleObject將自身掛起,直到別的線程釋放GIL,然后由操作系統將自己喚醒。

如果waitflag為0,Python會檢查當前GIL是否可用,GIL中的owned是指示GIL是否可用的變量,在前面的InitializeNonRecursiveMutex中我們看到這個值被初始化為-1。Python會檢查這個值是否為-1,如果是,則意味著GIL可用,必須將其置為0,當owned為0后,表示該GIL已經被一個線程占用,不再可用。

對于我們這里分析的調用PyEval_InitThread的主線程而言,由于在初始化GIL之后就調用PyThread_ acquire_lock申請GIL,到這時,并沒有第二個線程被創建,所以主線程會輕而易舉地獲得GIL的使用權。

注意這里的檢查和更新owned的操作是通過一個Win32的系統API——Interlocked- CompareExchange——來完成的。這個API是一個原子操作,其函數原形和功能如下。原形:InterlockedCompareExchange(PLONG dest, long exchange, long compared) 功能:如果*dest == compared,那么*dest = exchange

與InterlockedCompareExchange相同的,InterlockedIncrement也是一個原子操作,其功能是將mutex->owned的值增加1。從這里可以看到,當一個線程開始等待GIL時,其owned就會被增加1。顯然我們可以猜測,當一個線程最終釋放GIL時。

一定會將GIL的owned減1,這樣當所有需要GIL的線程都最終釋放了GIL之后,owned會再次變為-1,意味著GIL再次變為可用。為了清晰地展示這一點,我們現在就來看看PyThread_aquire_lock的逆運算,PyThread_release_lock每一個將從運行轉態轉為等待狀態的線程都會在被掛起之前調用它以釋放對GIL的占有。

最終,一個線程在釋放GIL時,會通過SetEvent通知所有在等待GIL的hevent這個Event內核對象的線程,結合前面的分析。如果這時候有線程在等待GIL的hevent,那么將被操作系統喚醒。這就是我們在前面介紹的Python將線程調度的第二個難題委托給操作系統來實現的機制。

到了這時,調用PyEval_InitThread的線程(也就是Python主線程)已經成功獲得了GIL,***會調用PyThread_get_thread_ident()。通過Win32的API:GetCurrent- ThreadId,獲得當前Python主線程的id,并將其賦給main_thread,main_thread是一個靜態全局變量,專職存儲Python主線程的線程id,用以判斷一個線程是否是Python主線程

值得注意的是,obj.done是一個Win32下的Semaphore內核對象,這個特殊的內核對象的用途我們馬上就會看到。我們創建線程的工作需要func和arg,但是Win32下創建線程的API只允許用戶指定一個自定義的參數,這就是需要用obj來打包的原因。

完成打包之后,調用Win32下創建thread的API:_beginthread來完成線程的創建。奇怪的是,我們期望的線程過程應該是thread1.py中定義的那個threadPoc呀,而這里指定的線程過程卻是一個相當面生的bootstrap。實際上,在bootstrap中,會最終調用thread1.py中定義的threadProc。

現在我們來理清一下Python當前的狀態。Python主線程當前實際上由兩個Win32下的原生thread構成,一個是執行python程序(python.exe)時操作系統創建的主線程,另一個是我們通過thread1.py創建的子線程。

主線程在執行PyEval_InitThread的過程中,獲得了GIL,但是目前已經被掛起,這是為了等待子線程中控制著的obj.done。子線程的線程過程是bootstrap,不過我們剛才已經猜測了。

從bootstrap出發,最終將在Python解釋器中執行python1.py中定義的theadProc。但是,我們知道,子線程為了訪問Python解釋器,必須首先獲得GIL,這是Python世界的游戲規則,誰也不能例外。所以,為了避免死鎖,子線程一定會在申請GIL之前通知obj.done。

【編輯推薦】

  1. 有關Python系統文件進行介紹指導
  2. 如何正確的使用Python函數
  3. 對Python 構建工具進行詳細介紹分析
  4. PythonAndroid淺析Python優勢所在
  5. 如何使用Python模塊解析配置文件?
責任編輯:chenqingxiang 來源: CSDN
相關推薦

2009-12-24 16:36:27

ADO Connect

2009-12-24 14:54:25

ADO.NET使用

2009-12-28 14:23:37

ADO啟動連接

2009-12-24 16:56:21

ADO.NET庫

2009-12-15 10:24:32

Visio 2008架

2010-02-26 15:43:02

Python線程

2010-02-01 17:33:24

Python主線程

2010-02-02 16:47:12

Python主線程

2009-11-27 09:24:29

VS2003命令

2009-12-24 17:01:42

ADO3.0

2010-03-02 10:36:05

Android窗體

2009-11-25 17:01:33

VS2005圖片

2010-03-10 19:34:45

Python主線程

2024-09-25 13:16:57

2010-02-23 17:35:46

Python

2020-07-09 09:55:40

機器人人工智能系統

2010-02-24 11:19:00

Python主線程

2010-03-01 13:28:44

Python子線程

2015-08-07 10:40:31

UI主線程

2010-02-22 15:13:01

Python模塊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91传媒在线观看 | 国产玖玖 | 久草在线在线精品观看 | 欧美11一13sex性hd | 成人av免费| 国产精品久久久久久久久久免费看 | 中文av在线播放 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 天天弄| 亚洲最大的成人网 | 日韩在线小视频 | www.亚洲区 | 久久国产精品视频观看 | 一区二区三区在线 | 欧美日韩国产精品一区 | 久久久久久天堂 | 欧美成人自拍 | 国产精品欧美精品日韩精品 | 紧缚调教一区二区三区视频 | 久久久精品久久 | 午夜精品久久久久久久久久久久 | 亚洲 欧美 精品 | 欧美中文字幕在线 | 日韩综合网| 久久成人国产精品 | 成人免费一级视频 | 欧美一级淫片免费视频黄 | 国产免费xxx | 欧美日批| 亚洲国产成人精品女人 | 成人影视网 | 韩日在线 | 亚洲免费在线 | 国产一区二区在线视频 | 五月婷婷婷 | 亚洲精品九九 | 欧美成年网站 | а天堂中文最新一区二区三区 | 毛片国产 | 久久久久精| 久久香蕉网 |