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

溫馨提示×

溫馨提示×

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

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

Python主線程銷毀子線程過程是怎樣的

發布時間:2021-11-02 17:37:03 來源:億速云 閱讀:857 作者:柒染 欄目:編程語言

Python主線程銷毀子線程過程是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

在處理完成后,Python主線程將銷毀線程,其實Python主線程的銷毀與子線程的銷毀是不同的,因為主線程的銷毀動作必須要通過銷毀Python的運行環境才可以生效,而子線程的銷毀則不需要進行這些動作。

Python首先會通過PyThreadState_Clear清理當前線程所對應的線程狀態對象。所謂清理,實際上比較簡單,就是對線程狀態對象中維護的東西進行引用計數的維護。隨后,Python釋放GIL,釋放GIL的操作是在PyThreadState_DeleteCurrent中完成的。

在PyThreadState_DeleteCurrent中,首先會刪除當前的線程狀態對象,然后通過PyEval_ReleaseLock釋放GIL。Python在函數PyThreadState_DeleteCurrent完成了絕大部分線程的銷毀動作,剩下的PyThread_exit_thread是一個平臺相關的操作,完成各個平臺上不同的銷毀原生線程的工作。在Win32下,實際上就是調用_endthread。

我們知道,Python的線程在GIL的控制之下,線程之間,對整個Python解釋器,對Python提供的C API的訪問,都是互斥的,這可以看作是Python內核級的互斥機制。但是這種互斥是我們不能控制的,我們還需要另一種可控的互斥機制——用戶級互斥。內核級通過GIL實現的互斥保護了內核的共享資源,同樣,用戶級互斥保護了用戶程序中的共享資源。考慮下面的例子:

[thread2.py]   import thread   import time   input = None  lock = thread.allocate_lock()   def threadProc():       while True:            print 'sub thread id : ', thread.get_ident()           print 'sub thread %d wait lock...' % thread.get_ident()           lock.acquire()           print 'sub thread %d get lock...' % thread.get_ident()           print 'sub thread %d receive input : %s' % (thread.get_ident(), input)           print 'sub thread %d release lock...' % thread.get_ident()           lock.release()           time.sleep(1)   thread.start_new_thread(threadProc, ())   print 'main thread id : ', thread.get_ident()   while True:       print 'main thread %d wait lock...' % thread.get_ident()       lock.acquire()       print 'main thread %d get lock...' % thread.get_ident()       input = raw_input()       print 'main thread %d release lock...' % thread.get_ident()       lock.release()       time.sleep(1)

在thread2.py中,有一個Python主線程和子線程之間共享的變量input。這個input是用戶的輸入,Python主線程接收輸入,而子線程打印用戶輸入。為了保證子線程在用戶輸入之后才激活打印動作,thread2.py使用了Python線程機制提供的Lock機制來實現同步動作,這實際上也可以視為線程之間的互斥。

主線程通過lock.acquire獲得lock之后,將獨享對input的訪問權利。子線程會因為等待lock而將自身掛起,直到主線程釋放lock之后才會被Python的線程調度機制喚醒,獲得訪問input的權力。注意,這里主線程需要使用sleep使自身掛起,才能觸發Python的線程調度,使得子線程獲得運行的機會。而這時主線程由于等待lock,同樣會將自身掛起,不能再訪問input。

  • 初次接觸Python部署問題解析

  • 強大快捷的Python操作語言全解析

  • 對Python 調試器豐富資源介紹

  • 對Python交互式技巧總結之談

  • 如何正確認識Python 源文件

于是,自始至終,每一個線程都能控制自己對input的使用,不用擔心別的線程破壞input的狀態。這種機制給了用戶控制線程之間交互的能力,是Python中實現線程互斥和同步的核心。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

锡林郭勒盟| 佛教| 吉安市| 汉阴县| 靖江市| 岱山县| 乾安县| 山东省| 大洼县| 武山县| 汕尾市| 蓝田县| 梅州市| 迭部县| 江门市| 西昌市| 海淀区| 禹城市| 佛冈县| 兴宁市| 寻甸| 平谷区| 康平县| 修水县| 中方县| 雷山县| 阳西县| 乐平市| 杭州市| 亳州市| 凤山市| 紫阳县| 太康县| 玛沁县| 石门县| 连江县| 囊谦县| 高州市| 梁河县| 广德县| 农安县|