偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺析Python多線程問(wèn)題

開發(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è)非常困擾的問(wèn)題。 

  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),沒(méi)想到吧,萬(wàn)萬(wàn)沒(méi)想到,它居然指示一個(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)的原生線程,并通過(guò)統(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多線程問(wèn)題

2017-01-19 10:24:38

Java多線程問(wèn)題

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)