成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深度說明Python主線程銷毀子線程過程

開發 后端
Python主線程在內核中訪問Python解釋器之前,需要做的就是先申請GIL,線程在用戶級需要訪問共享資源之前也需要先申請用戶級的lock。

在處理完成后,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實現的互斥保護了內核的共享資源,同樣,用戶級互斥保護了用戶程序中的共享資源。考慮下面的例子:

  1. [thread2.py]  
  2.  
  3. import thread  
  4.  
  5. import time  
  6.  
  7. input = None 
  8.  
  9. lock = thread.allocate_lock()  
  10.  
  11. def threadProc():  
  12.  
  13.     while True:   
  14.  
  15.         print 'sub thread id : ', thread.get_ident()  
  16.  
  17.         print 'sub thread %d wait lock...' % thread.get_ident()  
  18.  
  19.         lock.acquire()  
  20.  
  21.         print 'sub thread %d get lock...' % thread.get_ident()  
  22.  
  23.         print 'sub thread %d receive input : %s' % (thread.get_ident(), input)  
  24.  
  25.         print 'sub thread %d release lock...' % thread.get_ident()  
  26.  
  27.         lock.release()  
  28.  
  29.         time.sleep(1)  
  30.  
  31. thread.start_new_thread(threadProc, ())  
  32.  
  33. print 'main thread id : ', thread.get_ident()  
  34.  
  35. while True:  
  36.  
  37.     print 'main thread %d wait lock...' % thread.get_ident()  
  38.  
  39.     lock.acquire()  
  40.  
  41.     print 'main thread %d get lock...' % thread.get_ident()  
  42.  
  43.     input = raw_input()  
  44.  
  45.     print 'main thread %d release lock...' % thread.get_ident()  
  46.  
  47.     lock.release()  
  48.  
  49.     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。#t#

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

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

責任編輯:chenqingxiang 來源: itchinaclub.blog
相關推薦

2010-03-01 13:28:44

Python子線程

2010-02-01 17:33:24

Python主線程

2010-02-02 16:47:12

Python主線程

2024-04-02 09:53:08

線程池線程堆棧

2010-02-02 14:42:38

Python線程

2010-03-01 13:13:02

Python應用線程

2012-05-14 17:09:05

iOS

2010-02-26 15:37:11

Python主線程

2020-12-21 06:18:15

Android線程主線程

2010-03-10 19:34:45

Python主線程

2024-06-13 09:30:33

Java線程池線程

2021-04-08 10:51:10

主線程子線程Thread

2010-02-26 09:42:52

Python線程池

2020-09-07 07:33:01

NodejsCPU密集型

2009-08-12 13:22:44

Singleton模式

2010-03-15 18:34:08

Java多線程

2009-12-08 09:00:14

WCF線程

2010-02-03 16:15:05

Python語言

2011-06-29 16:34:11

Qt 子線程 線程

2025-04-28 08:20:40

ndroid主線程線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97精品超碰一区二区三区 | 亚洲一二三在线 | 91精品国产91久久久久久最新 | 亚洲另类自拍 | 二区久久 | 亚洲欧美国产毛片在线 | 久久99精品久久久久久国产越南 | 久久99蜜桃综合影院免费观看 | 色视频欧美 | 在线观看www视频 | 欧美不卡一区二区三区 | 国产免费色 | 天天综合久久 | 麻豆一区二区三区 | 亚洲一区欧美一区 | 毛片视频免费 | 请别相信他免费喜剧电影在线观看 | 夜夜操av | 久久国产精品久久久久久久久久 | 亚洲精彩视频在线观看 | 自拍视频在线观看 | 一区二区三区福利视频 | 一区二区视频在线 | 久久精品国产亚洲一区二区三区 | 亚洲高清av| 久久久久久久91 | 自拍偷拍亚洲欧美 | 日韩一区二区不卡 | 在线免费观看成年人视频 | 久久久久中文字幕 | 天堂久 | 啪啪av | 成人一级片在线观看 | 国产精品国产三级国产a | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 91视视频在线观看入口直接观看 | 久久99视频 | 影音先锋中文字幕在线观看 | 亚洲欧美一区二区三区国产精品 | 俺去俺来也www色官网cms | 国产精品一区二区不卡 |