Python主線程與子線程的區(qū)別是什么

Python主線程與子線程的區(qū)別是什么,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

公司主營業(yè)務(wù):網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出綏寧免費(fèi)做網(wǎng)站回饋大家。

Python子線程在創(chuàng)建自身的線程狀態(tài)對象后,會通過_PyGILState_NoteThreadState這個(gè)語句將這個(gè)對象放入到線程狀態(tài)對象鏈表中,當(dāng)前活動(dòng)的Python子線程不一定是獲得了GIL的線程。

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

Python級的線程調(diào)度一定意味著GIL擁有權(quán)的易手,而操作系統(tǒng)級的線程調(diào)度并不一定意味著GIL的易手,當(dāng)所有的線程都完成了初始化動(dòng)作之后。操作系統(tǒng)的線程調(diào)度和Python的線程調(diào)度才會同一。那時(shí),Python的線程調(diào)度會迫使當(dāng)前活動(dòng)線程釋放GIL,而這一操作會觸發(fā)GIL中維護(hù)的Event內(nèi)核對象。

這個(gè)觸發(fā)又進(jìn)而觸發(fā)操作系統(tǒng)的線程調(diào)度。而在線程的初始化完成之前,在Python線程調(diào)度和操作系統(tǒng)線程調(diào)度之間并沒有這樣的因果關(guān)系。顯示了GIL在Python級線程調(diào)度與操作系統(tǒng)級線程調(diào)度之間所起的橋梁作用。

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

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

當(dāng)子線程被Python的線程調(diào)度機(jī)制喚醒之后,它所作的***件事就是通過PyThreadState_Swap將Python維護(hù)的當(dāng)前線程狀態(tài)對象設(shè)置為其自身的狀態(tài)對象,一如操作系統(tǒng)的進(jìn)程上下文環(huán)境恢復(fù)一樣。

現(xiàn)在我們的Python子線程開始等待GIL,但是注意,線程的初始化還沒有真正完成,因?yàn)樽泳€程還沒有順利進(jìn)入字節(jié)碼解釋器。當(dāng)Python線程調(diào)度將子線程喚醒之后。子線程將回到t_bootstrap中。

并進(jìn)入PyEval_CallObjectWithKeywords,從這里一直往前,最終將調(diào)用PyEval_EvalFrameEx,進(jìn)入解釋器。到了那個(gè)時(shí)候,Python子線程和主線程一樣,就完全被Python線程調(diào)度機(jī)制所控制了。

Python主線程與子線程的區(qū)別是什么

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

關(guān)于Python主線程與子線程的區(qū)別是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

網(wǎng)站標(biāo)題:Python主線程與子線程的區(qū)別是什么
URL標(biāo)題:http://m.kartarina.com/article22/gecijc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號網(wǎng)站建設(shè)商城網(wǎng)站品牌網(wǎng)站建設(shè)標(biāo)簽優(yōu)化域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
主站蜘蛛池模板: 亚洲av永久无码精品网站| 亚洲欧洲AV无码专区| 精品久久久久久无码专区| 无码国内精品久久人妻| 日韩视频无码日韩视频又2021| 西西4444www大胆无码| 岛国av无码免费无禁网站| 精品无码久久久久久久久| 无套内射在线无码播放| 亚洲精品无码日韩国产不卡?V| 亚洲韩国精品无码一区二区三区| 内射人妻无码色AV天堂| 日韩人妻无码精品久久久不卡| 在线观看无码的免费网站| 亚洲AV无码1区2区久久| 亚洲精品无码av天堂| 少妇无码AV无码专区线| 无码人妻久久久一区二区三区| 国产精品午夜无码体验区 | 国产精品无码无卡在线观看久 | mm1313亚洲精品无码又大又粗| 中文字幕人妻无码一区二区三区| 亚洲av无码日韩av无码网站冲| 欧洲成人午夜精品无码区久久 | 亚洲AV无码成人专区片在线观看| 亚洲爆乳少妇无码激情| 久久久久久亚洲AV无码专区| 中文精品无码中文字幕无码专区 | 精品无码人妻一区二区三区| 人妻无码精品久久亚瑟影视| 中文字幕韩国三级理论无码| 免费A级毛片无码视频| 人妻无码人妻有码中文字幕| 亚洲中文字幕无码一久久区| aⅴ一区二区三区无卡无码| 亚洲成av人片天堂网无码】| 国产成人无码AV麻豆| 中文字幕人成无码免费视频| 亚洲av成人中文无码专区| 亚洲精品无码一区二区| 亚洲AV无码国产精品永久一区|