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

淺析Python多線程問題

開發 后端
一個程序里可能會包含多個執行的線程。在這里,每個線程被分為Python多線程里一個單獨的塊,每個進程可以含有多個塊,可以共享多個塊中的數據。

Python多線程環境的建立,說得直白一點,主要就是創建GIL。我們已經知道GIL對于Python的多線程機制的重要意義,然而這個GIL到底是如何實現的呢,哎這還是個非常困擾的問題。 

  1.  
  2. PNRMUTEX AllocNonRecursiveMutex(void)  
  3.  
  4. {  
  5.  
  6.     PNRMUTEX mutex = (PNRMUTEX)malloc(sizeof(NRMUTEX)) ;  
  7.  
  8.     if(mutex && !InitializeNonRecursiveMutex(mutex)) {  
  9.  
  10.             free(mutex);  
  11.  
  12.             Mutex = NULL;  
  13.  
  14.     }  
  15.  
  16.     return mutex ;  
  17.  
  18. }  
  19.  
  20. BOOL InitializeNonRecursiveMutex(PNRMUTEX mutex)  
  21.  
  22. {  
  23.  
  24.     ……  
  25.  
  26.     mutex->owned = -1 ;  /* No threads have entered NonRecursiveMutex */  
  27.  
  28.     mutex->thread_id = 0 ;  
  29.  
  30.     mutex->hevent = CreateEvent(NULL, FALSE, FALSE, NULL) ;  
  31.  
  32.     return mutex->hevent != NULL ;  /* TRUE if the mutex is created */  
  33.  
  34. }  

終于見識到了神秘的GIL(interpreter_lock),沒想到吧,萬萬沒想到,它居然指示一個簡單的void*。但是轉念一想,在C中void*幾乎可以是任何東西,這家伙,可是個***容器啊。

可以看到,無論創建多少個線程,Python建立多線程環境的動作只會執行一次。在PyEval_InitThreads的開始,Python會檢查GIL是否已經被創建。如果是,則不再進行任何動作,否則,就會創建這個GIL。創建GIL的工作由PyThread_allocate_lock完成,我們來看一看這個GIL到底是何方神圣。

在這里,我們終于看到了Python多線程機制的平臺相關性,在Python25\Python目錄下,有一大批thread這樣的文件。在這些文件中,包裝了不同操作系統的原生線程,并通過統一的接口暴露給Python,比如這里的PyThread_allocate_lock就是這樣一個接口。#t#

我們這里的thread_nt.h中包裝的是Win32平臺的原生thread,在本章中后面的代碼剖析中,還會有大量與平臺相關的代碼,我們都以Win32平臺為例。在PyThread_allocate_lock中,與PyEval_InitThreads非常類似的,它會檢查一個initialized的變量,如果說GIL指示著Python多線程環境是否已經建立。

那么這個initialized變量就指示著為了使用底層平臺所提供的原生thread,必須的初始化動作是否完成。這些必須的初始化動作通常都是底層操作系統所提供的API,不同的操作系統可能需要不同的初始化動作。

在PyThread_allocate_lock中,出現了一個關鍵的結構體PNRMUTEX,我們發現,這個結構體是函數的返回值,實際上也就是PyEval_InitThread中需要創建的那個interperter_lock(GIL)。原來GIL就是這個家伙,我們來看一看它的真身。

  1. [thread_nt.h]  
  2.  
  3. PNRMUTEX AllocNonRecursiveMutex(void)  
  4.  
  5. {  
  6.  
  7.     PNRMUTEX mutex = (PNRMUTEX)malloc(sizeof(NRMUTEX)) ;  
  8.  
  9.     if(mutex && !InitializeNonRecursiveMutex(mutex)) {  
  10.  
  11.             free(mutex);  
  12.  
  13.             Mutex = NULL;  
  14.  
  15.     }  
  16.  
  17.     return mutex ;  
  18.  
  19. }  
  20.  
  21. BOOL InitializeNonRecursiveMutex(PNRMUTEX mutex)  
  22.  
  23. {  
  24.  
  25.     ……  
  26.  
  27.     mutex->owned = -1 ;  /* No threads have entered NonRecursiveMutex */  
  28.  
  29.     mutex->thread_id = 0 ;  
  30.  
  31.     mutex->hevent = CreateEvent(NULL, FALSE, FALSE, NULL) ;  
  32.  
  33.     return mutex->hevent != NULL ;  /* TRUE if the mutex is created */  
  34.  
  35. }  

在NRMUTEX中,所有的數據成員的類型都是Win32平臺下的類型風格了,owned和thread_id都很普通,而其中的HANDLE hevent卻值得注意,我們來看看AllocNon- RecursiveMutex究竟為這個hevent準備了什么。

責任編輯:chenqingxiang 來源: 博客園
相關推薦

2011-04-08 10:36:38

MFC多線程

2009-07-03 17:18:34

Servlet多線程

2010-03-03 17:44:07

Python多線程

2009-08-12 18:04:44

編寫C#多線程

2009-07-17 17:29:13

多任務多線程

2011-08-29 16:16:22

Lua函數多線程

2011-06-24 11:12:39

Qt 多線程 線程

2011-06-24 11:03:31

Qt 多線程 線程

2009-04-27 13:15:04

多線程方法run()

2019-09-26 10:19:27

設計電腦Java

2009-08-21 11:31:59

異步和多線程的區別

2021-03-05 07:38:52

C++線程編程開發技術

2014-08-13 10:41:08

linux線程

2010-01-18 14:09:58

C++多線程

2015-12-22 10:39:52

Java多線程問題

2017-01-19 10:24:38

Java多線程問題

2013-05-29 10:47:50

Android開發Java多線程java面試題

2009-07-03 16:53:11

Servlet容器

2010-03-16 19:29:26

Java多線程操作

2009-10-16 10:20:37

Python的GIL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线国产一区二区 | 久久精品国产精品青草 | 国产激情91久久精品导航 | 色一情一乱一伦一区二区三区 | 亚洲精品在线看 | 老熟女毛片 | 国产成人在线视频免费观看 | 欧美日韩成人 | 国产欧美日韩视频 | 亚洲国产成人精品久久久国产成人一区 | 日本成人在线观看网站 | 九九久久久 | 日本久久久久久 | 黄色av观看 | 一级片av | 欧美黑人又粗大 | www国产精品| 国产精品日日摸夜夜添夜夜av | 成人国产精品久久 | 亚洲+变态+欧美+另类+精品 | 中文字幕一区二区在线观看 | 亚洲视频免费在线观看 | 国产一区二区三区亚洲 | 午夜精品一区二区三区在线视频 | 国产 日韩 欧美 在线 | 午夜久久久久久久久久一区二区 | 免费观看成人鲁鲁鲁鲁鲁视频 | 99精品国产一区二区三区 | 午夜精品久久久久久久星辰影院 | 中文字幕国 | 亚洲综合久久久 | 久久精品免费 | 国产精品欧美一区二区三区 | 欧美男人天堂 | 久久久91精品国产一区二区三区 | 亚洲一区二区在线视频 | 爱爱综合网 | 久久精彩视频 | 久久99网 | 国产特黄一级 | 91精品国产乱码麻豆白嫩 |