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

淺析Python多線程問題

開發(fā) 后端
一個(gè)程序里可能會(huì)包含多個(gè)執(zhí)行的線程。在這里,每個(gè)線程被分為Python多線程里一個(gè)單獨(dú)的塊,每個(gè)進(jìn)程可以含有多個(gè)塊,可以共享多個(gè)塊中的數(shù)據(jù)。

Python多線程環(huán)境的建立,說(shuō)得直白一點(diǎn),主要就是創(chuàng)建GIL。我們已經(jīng)知道GIL對(duì)于Python的多線程機(jī)制的重要意義,然而這個(gè)GIL到底是如何實(shí)現(xiàn)的呢,哎這還是個(gè)非常困擾的問題。 

  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. }  

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

可以看到,無(wú)論創(chuàng)建多少個(gè)線程,Python建立多線程環(huán)境的動(dòng)作只會(huì)執(zhí)行一次。在PyEval_InitThreads的開始,Python會(huì)檢查GIL是否已經(jīng)被創(chuàng)建。如果是,則不再進(jìn)行任何動(dòng)作,否則,就會(huì)創(chuàng)建這個(gè)GIL。創(chuàng)建GIL的工作由PyThread_allocate_lock完成,我們來(lái)看一看這個(gè)GIL到底是何方神圣。

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

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

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

在PyThread_allocate_lock中,出現(xiàn)了一個(gè)關(guān)鍵的結(jié)構(gòu)體PNRMUTEX,我們發(fā)現(xiàn),這個(gè)結(jié)構(gòu)體是函數(shù)的返回值,實(shí)際上也就是PyEval_InitThread中需要?jiǎng)?chuàng)建的那個(gè)interperter_lock(GIL)。原來(lái)GIL就是這個(gè)家伙,我們來(lái)看一看它的真身。

  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中,所有的數(shù)據(jù)成員的類型都是Win32平臺(tái)下的類型風(fēng)格了,owned和thread_id都很普通,而其中的HANDLE hevent卻值得注意,我們來(lái)看看AllocNon- RecursiveMutex究竟為這個(gè)hevent準(zhǔn)備了什么。

責(zé)任編輯:chenqingxiang 來(lái)源: 博客園
相關(guān)推薦

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

多任務(wù)多線程

2011-08-29 16:16:22

Lua函數(shù)多線程

2011-06-24 11:03:31

Qt 多線程 線程

2011-06-24 11:12:39

Qt 多線程 線程

2009-04-27 13:15:04

多線程方法run()

2019-09-26 10:19:27

設(shè)計(jì)電腦Java

2009-08-21 11:31:59

異步和多線程的區(qū)別

2021-03-05 07:38:52

C++線程編程開發(fā)技術(shù)

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開發(fā)Java多線程java面試題

2009-07-03 16:53:11

Servlet容器

2010-03-16 19:29:26

Java多線程操作

2023-10-06 23:06:01

多線程Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美v在线 | 日本一二区视频 | 欧美色综合天天久久综合精品 | 国产精品精品久久久 | 日韩视频在线播放 | 成人免费一级视频 | 成人一区二区三区 | 日本网站在线看 | av一区二区在线观看 | 国产成人一区二区 | 久久久久久毛片免费观看 | 欧美三级视频在线观看 | 国产网站在线播放 | 91精品国产欧美一区二区 | 99久久久久久久 | 亚洲精品久久久久久一区二区 | 久久不卡 | 国产成人免费视频网站高清观看视频 | 亚洲欧美激情精品一区二区 | 国产精品一区二区在线免费观看 | 一二三四在线视频观看社区 | 老牛影视av一区二区在线观看 | 国产日韩精品久久 | 亚洲二区视频 | 久国产精品 | 国产一级片久久久 | 欧美日韩在线高清 | 国产精品日韩在线观看一区二区 | 亚洲网在线 | 成人精品 | 久久九九影视 | 欧一区二区 | 成人在线中文字幕 | 欧美一区二区三区在线观看 | 欧美精品一区在线 | 亚洲免费精品一区 | 天天躁日日躁狠狠很躁 | 欧美日日 | 国产高清在线 | 91九色视频在线 | 欧美精品一区二区免费视频 |