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

Python主線程與Python子線程之間區別之談

開發 后端
下面您所看的文章主要展示了從主線程開始創建Python子線程,以及主線程到子線程進入Python解釋器的所有函數調用。

Python子線程在創建自身的線程狀態對象后,會通過_PyGILState_NoteThreadState這個語句將這個對象放入到線程狀態對象鏈表中,當前活動的Python子線程不一定是獲得了GIL的線程。

在thread1.py中主線程現在是獲得了GIL的,但是子線程到現在還沒有申請GIL,自然也不會將自身掛起。由于主線程和子線程都是Win32的原生線程。所以操作系統可能在主線程和Python子線程之間切換。我們在這里要著重指出操作系統級的線程調度和Python級的線程調度是不同的。

Python級的線程調度一定意味著GIL擁有權的易手,而操作系統級的線程調度并不一定意味著GIL的易手,當所有的線程都完成了初始化動作之后。操作系統的線程調度和Python的線程調度才會同一。那時,Python的線程調度會迫使當前活動線程釋放GIL,而這一操作會觸發GIL中維護的Event內核對象。

這個觸發又進而觸發操作系統的線程調度。而在線程的初始化完成之前,在Python線程調度和操作系統線程調度之間并沒有這樣的因果關系。顯示了GIL在Python級線程調度與操作系統級線程調度之間所起的橋梁作用。

前面我們已經剖析過PyEval_AcquireThread的代碼,在PyEval_AcquireThread中,子線程進行了***的沖刺,它要生存,要執行,于是它開始通過PyThread_acquire_ lock爭取GIL。到了這一步。

Python子線程將自己掛起,操作系統的線程調度機制再也不能靠自身的力量將其喚醒,只有等待Python的線程調度機制強迫主線程放棄GIL后。子線程才會被喚醒;而子線程被喚醒之后,主線程卻又陷入了苦苦地等待中,同樣苦苦地守望著Python強迫子線程放棄GIL的那一刻。

子線程被Python的線程調度機制喚醒之后,它所作的***件事就是通過PyThreadState_Swap將Python維護的當前線程狀態對象設置為其自身的狀態對象,一如操作系統的進程上下文環境恢復一樣。

現在我們的Python子線程開始等待GIL,但是注意,線程的初始化還沒有真正完成,因為子線程還沒有順利進入字節碼解釋器。當Python線程調度將子線程喚醒之后。子線程將回到t_bootstrap中。

并進入PyEval_CallObjectWithKeywords,從這里一直往前,最終將調用PyEval_EvalFrameEx,進入解釋器。到了那個時候,Python子線程和主線程一樣,就完全被Python線程調度機制所控制了。

需要注意的是,PyThread_start_new_thread是在主線程中執行的,而從bootstrap開始,則是在子線程中執行的。其中涉及線程銷毀的動作,如PyThreadState_ DeleteCurrent等,將在后續的部分剖析。到了這里,讀者可能有些疑惑了,我們花費了大量篇幅剖析的線程狀態對象鏈表似乎沒有什么用啊。其實不然,試想一下,當線程調度發生時。

在Python一級,需要通過之前剖析過的PyTrheadState_Swap函數切換當前的線程狀態對象,這時候就需要根據線程id從線程狀態對象鏈表中獲取線程對象了。事實上,在Python內部的許多API中,比如PyGILState_Ensure等等中,都會涉及這個鏈表,這些API在C與Python交互時可能被大量調用,有興趣的讀者可以自行深入探索一下。

【編輯推薦】

  1. 漫談Python 源代碼編制技巧
  2. 簡單易于操作的Python 工具詳解
  3. 有關Python應用領域進行說明介紹
  4. PythonAndroid面向對象的編程——Python應用程序
  5. 如何使用Python模塊解析配置文件 ?
責任編輯:chenqingxiang 來源: CSDN
相關推薦

2010-03-16 17:16:38

Java多線程

2010-02-24 11:19:00

Python主線程

2020-12-21 06:18:15

Android線程主線程

2010-02-02 16:47:12

Python主線程

2010-02-01 17:33:24

Python主線程

2021-12-26 18:22:30

Java線程多線程

2011-06-22 16:02:37

Qt 多線程 重入

2010-03-10 19:34:45

Python主線程

2017-01-10 13:39:57

Python線程池進程池

2010-02-26 15:37:11

Python主線程

2018-07-06 14:00:55

Linux進程線程

2010-03-18 16:02:09

python 多線程

2021-08-12 16:28:10

AndroidHandleLooper

2010-01-21 11:25:44

linux多線程線程資源

2021-12-28 09:10:55

Java線程狀態

2012-05-14 17:09:05

iOS

2021-12-14 08:28:08

Java多線程線程

2011-06-22 16:08:40

Qt 多線程 事件循環

2021-02-25 15:58:46

C++線程編程開發技術

2011-06-22 15:42:18

QT 信號
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线精品一区二区 | 一二三四在线视频观看社区 | 一级黄a| 日韩激情免费 | 在线免费观看a级片 | 中文一区二区 | 超碰导航 | 国产精品一区二区三区四区 | 午夜精品视频一区 | 国产精品毛片一区二区在线看 | 2022精品国偷自产免费观看 | 成人在线一区二区 | 日韩一二区在线 | 青草青草久热精品视频在线观看 | 亚洲一区二区三区视频免费观看 | 91久久综合| 久久精品久久久久久 | 国产一区二区免费 | 久久精品中文字幕 | 精品国产乱码久久久久久影片 | 一区中文字幕 | 久久精品二区亚洲w码 | 色精品 | 国产精品黄色 | 久久大香 | 懂色tv| 国产极品车模吞精高潮呻吟 | 亚洲福利视频一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 欧美一级片a | 黄色播放| 欧美精品网站 | 污视频免费在线观看 | 久久久久国产 | 成人av免费| 日韩成人在线播放 | 日本特黄特色aaa大片免费 | 国产欧美视频一区二区三区 | 欧美大片黄| 蜜桃毛片| 亚洲国产精品99久久久久久久久 |