真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python主線程銷毀子線程過(guò)程是怎樣的

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

成都創(chuàng)新互聯(lián)公司是專業(yè)的泰興網(wǎng)站建設(shè)公司,泰興接單;提供做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行泰興網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

在處理完成后,Python主線程將銷毀線程,其實(shí)Python主線程的銷毀與子線程的銷毀是不同的,因?yàn)橹骶€程的銷毀動(dòng)作必須要通過(guò)銷毀Python的運(yùn)行環(huán)境才可以生效,而子線程的銷毀則不需要進(jìn)行這些動(dòng)作。

Python首先會(huì)通過(guò)PyThreadState_Clear清理當(dāng)前線程所對(duì)應(yīng)的線程狀態(tài)對(duì)象。所謂清理,實(shí)際上比較簡(jiǎn)單,就是對(duì)線程狀態(tài)對(duì)象中維護(hù)的東西進(jìn)行引用計(jì)數(shù)的維護(hù)。隨后,Python釋放GIL,釋放GIL的操作是在PyThreadState_DeleteCurrent中完成的。

在PyThreadState_DeleteCurrent中,首先會(huì)刪除當(dāng)前的線程狀態(tài)對(duì)象,然后通過(guò)PyEval_ReleaseLock釋放GIL。Python在函數(shù)PyThreadState_DeleteCurrent完成了絕大部分線程的銷毀動(dòng)作,剩下的PyThread_exit_thread是一個(gè)平臺(tái)相關(guān)的操作,完成各個(gè)平臺(tái)上不同的銷毀原生線程的工作。在Win32下,實(shí)際上就是調(diào)用_endthread。

我們知道,Python的線程在GIL的控制之下,線程之間,對(duì)整個(gè)Python解釋器,對(duì)Python提供的C API的訪問(wèn),都是互斥的,這可以看作是Python內(nèi)核級(jí)的互斥機(jī)制。但是這種互斥是我們不能控制的,我們還需要另一種可控的互斥機(jī)制——用戶級(jí)互斥。內(nèi)核級(jí)通過(guò)GIL實(shí)現(xiàn)的互斥保護(hù)了內(nèi)核的共享資源,同樣,用戶級(jí)互斥保護(hù)了用戶程序中的共享資源。考慮下面的例子:

[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中,有一個(gè)Python主線程和子線程之間共享的變量input。這個(gè)input是用戶的輸入,Python主線程接收輸入,而子線程打印用戶輸入。為了保證子線程在用戶輸入之后才激活打印動(dòng)作,thread2.py使用了Python線程機(jī)制提供的Lock機(jī)制來(lái)實(shí)現(xiàn)同步動(dòng)作,這實(shí)際上也可以視為線程之間的互斥。

當(dāng)主線程通過(guò)lock.acquire獲得lock之后,將獨(dú)享對(duì)input的訪問(wèn)權(quán)利。子線程會(huì)因?yàn)榈却齦ock而將自身掛起,直到主線程釋放lock之后才會(huì)被Python的線程調(diào)度機(jī)制喚醒,獲得訪問(wèn)input的權(quán)力。注意,這里主線程需要使用sleep使自身掛起,才能觸發(fā)Python的線程調(diào)度,使得子線程獲得運(yùn)行的機(jī)會(huì)。而這時(shí)主線程由于等待lock,同樣會(huì)將自身掛起,不能再訪問(wèn)input。

  • 初次接觸Python部署問(wèn)題解析

  • 強(qiáng)大快捷的Python操作語(yǔ)言全解析

  • 對(duì)Python 調(diào)試器豐富資源介紹

  • 對(duì)Python交互式技巧總結(jié)之談

  • 如何正確認(rèn)識(shí)Python 源文件

于是,自始至終,每一個(gè)線程都能控制自己對(duì)input的使用,不用擔(dān)心別的線程破壞input的狀態(tài)。這種機(jī)制給了用戶控制線程之間交互的能力,是Python中實(shí)現(xiàn)線程互斥和同步的核心。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


標(biāo)題名稱:Python主線程銷毀子線程過(guò)程是怎樣的
文章URL:http://weahome.cn/article/gishie.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部