中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python主線程與子線程的區別是什么

發布時間:2021-07-05 16:57:57 來源:億速云 閱讀:593 作者:Leah 欄目:編程語言

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線程調度機制所控制了。

Python主線程與子線程的區別是什么

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

關于Python主線程與子線程的區別是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

容城县| 淮滨县| 泸定县| 朔州市| 巴里| 太保市| 梧州市| 宁安市| 蒙自县| 东台市| 西宁市| 磐石市| 内黄县| 济源市| 仲巴县| 拉萨市| 沁水县| 栾城县| 保德县| 万全县| 迭部县| 大理市| 长垣县| 平乡县| 崇文区| 永登县| 柞水县| 阜阳市| 盘锦市| 乌兰县| 嘉禾县| 塔河县| 剑河县| 章丘市| 奎屯市| 孙吴县| 平利县| 台北县| 慈溪市| 砀山县| 新干县|