日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深度說明Python主線程銷毀子線程過程

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

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

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

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

 
 
 
  1. [thread2.py]
  2. import thread
  3. import time
  4. input = None
  5. lock = thread.allocate_lock()
  6. def threadProc():
  7.     while True: 
  8.         print 'sub thread id : ', thread.get_ident()
  9.         print 'sub thread %d wait lock...' % thread.get_ident()
  10.         lock.acquire()
  11.         print 'sub thread %d get lock...' % thread.get_ident()
  12.         print 'sub thread %d receive input : %s' % (thread.get_ident(), input)
  13.         print 'sub thread %d release lock...' % thread.get_ident()
  14.         lock.release()
  15.         time.sleep(1)
  16. thread.start_new_thread(threadProc, ())
  17. print 'main thread id : ', thread.get_ident()
  18. while True:
  19.     print 'main thread %d wait lock...' % thread.get_ident()
  20.     lock.acquire()
  21.     print 'main thread %d get lock...' % thread.get_ident()
  22.     input = raw_input()
  23.     print 'main thread %d release lock...' % thread.get_ident()
  24.     lock.release()
  25.     time.sleep(1)

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

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

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

在本節(jié)中,我們將詳細剖析Python中Lock機制的實現(xiàn),有了前面關(guān)于Python中線程實現(xiàn)的基礎(chǔ),你會發(fā)現(xiàn),Lock機制的實現(xiàn)真的可以用順其自然來形容。在進入Lock機制的實現(xiàn)之前,我們先來看看thread2.py的輸出結(jié)果,以對Lock機制有一個感性的認識。


網(wǎng)頁題目:深度說明Python主線程銷毀子線程過程
文章出自:http://m.5511xx.com/article/dpcdeep.html