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

如何進(jìn)行建立Python主線程?

開發(fā) 后端
本文對(duì)Python主線程進(jìn)行選擇,IDE選擇及編碼的解決方案進(jìn)行了一番詳細(xì)的描述,實(shí)為Python初學(xué)者必讀的Python學(xué)習(xí)經(jīng)驗(yàn)心得。

Python里如果你建立一個(gè)程序,就是一個(gè)進(jìn)程,其中包含一個(gè)線程,這個(gè)就是主線程,而是為了提高資源使用效率來(lái)提高系統(tǒng)的效率,希望大家能夠再次學(xué)到自己想要的信息。

從這里可以看到,當(dāng)一個(gè)線程開始等待GIL時(shí),其owned就會(huì)被增加1。顯然我們可以猜測(cè),當(dāng)一個(gè)線程最終釋放GIL時(shí),一定會(huì)將GIL的owned減1,這樣當(dāng)所有需要GIL的線程都最終釋放了GIL之后,owned會(huì)再次變?yōu)?1,意味著GIL再次變?yōu)榭捎谩?/P>

為了清晰地展示這一點(diǎn),我們現(xiàn)在就來(lái)看看PyThread_aquire_lock的逆運(yùn)算,PyThread_release_lock每一個(gè)將從運(yùn)行轉(zhuǎn)態(tài)轉(zhuǎn)為等待狀態(tài)的線程都會(huì)在被掛起之前調(diào)用它以釋放對(duì)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. }  

最終,一個(gè)線程在釋放GIL時(shí),會(huì)通過SetEvent通知所有在等待GIL的hevent這個(gè)Event內(nèi)核對(duì)象的線程,結(jié)合前面的分析,如果這時(shí)候有線程在等待GIL的hevent,那么將被操作系統(tǒng)喚醒。

這就是我們?cè)谇懊娼榻B的Python將線程調(diào)度的第二個(gè)難題委托給操作系統(tǒng)來(lái)實(shí)現(xiàn)的機(jī)制。到了這時(shí),調(diào)用PyEval_InitThread的線程(也就是Python主線程)已經(jīng)成功獲得了GIL。***會(huì)調(diào)用PyThread_get_thread_ident()。

通過Win32的API:GetCurrent- ThreadId,獲得當(dāng)前Python主線程的id,并將其賦給main_thread,main_thread是一個(gè)靜態(tài)全局變量,專職存儲(chǔ)Python主線程的線程id,用以判斷一個(gè)線程是否是Python主線程

在完成了多線程環(huán)境的初始化之后,Python會(huì)開始創(chuàng)建底層平臺(tái)的原生thread,以thread1.py為例,這個(gè)原生thread將執(zhí)行threadProc所定義的操作。從現(xiàn)在開始,為了描述的清晰性,我們將Python主線程,也就是調(diào)用thread_PyThread_start_new_thread創(chuàng)建新的線程的線程稱為主線程,而將與threadProc對(duì)應(yīng)的原生thread稱之為子線程。現(xiàn)在我們來(lái)看看一個(gè)子線程是如何被創(chuàng)建的。

  1. static PyObject* thread_PyThread_start_new_thread(PyObject *self, PyObject  
  2.  
  3.   *fargs)  
  4.  
  5. {  
  6.  
  7.     PyObject *func, *args, *keyw = NULL;  
  8.  
  9.     struct bootstate *boot;  
  10.  
  11.     long ident;  
  12.  
  13.     PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3, &func, &args, &keyw);  
  14.  
  15.     //[1]:創(chuàng)建bootstate結(jié)構(gòu)  
  16.  
  17.     boot = PyMem_NEW(struct bootstate, 1);  
  18.  
  19.     boot->interp = PyThreadState_GET()->interp;  
  20.  
  21.     boot->funcfunc = func;  
  22.  
  23.     boot->argsargs = args;  
  24.  
  25.     boot->keywkeyw = keyw;  
  26.  
  27.     //[2]:初始化多線程環(huán)境  
  28.  
  29.     PyEval_InitThreads(); /* Start the interpreter's thread-awareness */  
  30.  
  31.     //[3]:創(chuàng)建線程  
  32.  
  33.     ident = PyThread_start_new_thread(t_bootstrap, (void*) boot);  
  34.  
  35.     return PyInt_FromLong(ident);  
  36.  
  37. [thread.c]  
  38.  
  39. /* Support for runtime thread stack size tuning.  
  40.  
  41.    A value of 0 means using the platform's default stack size  
  42.  
  43.    or the size specified by the THREAD_STACK_SIZE macro. */  
  44.  
  45. static size_t _pythread_stacksize = 0;  
  46.  
  47. [thread_nt.h]  
  48.  
  49. long PyThread_start_new_thread(void (*func)(void *), void *arg)  
  50.  

Python主線程通過調(diào)用PyThread_start_new_thread完成創(chuàng)建子線程的工作。為了清晰地理解PyThread_start_new_thread的工作,我們需要特別注意該函數(shù)的參數(shù)。從thread_ PyThread_start_new_thread中可以看到,這里的func實(shí)際上是函數(shù)t_bootstrap,而arg則是在thread_PyThread_start_new_thread中創(chuàng)建的bootstate結(jié)構(gòu)體boot。在boot中,保存著Python程序(thread1.py)中所定義的線程的信息。

【編輯推薦】

  1. 如何使Python嵌入C++應(yīng)用程序?
  2. 深入探討Ruby與Python語(yǔ)法比較
  3. Python學(xué)習(xí)資料介紹分享
  4. Python學(xué)習(xí)經(jīng)驗(yàn)談:版本、IDE選擇及編碼解 決方案
  5. 淺析Python的GIL和線程安全
責(zé)任編輯:chenqingxiang 來(lái)源: 博客園
相關(guān)推薦

2010-02-02 16:47:12

Python主線程

2010-03-10 19:34:45

Python主線程

2010-07-01 13:29:08

vsftpd

2010-02-01 10:21:36

Python編碼轉(zhuǎn)換

2010-02-22 16:05:40

Python配置

2024-07-08 08:38:37

Python游戲開發(fā)

2010-02-03 13:55:51

Python 代碼

2010-02-26 15:37:11

Python主線程

2010-02-01 14:48:43

2010-02-01 18:20:17

Python 多重繼承

2010-03-11 17:38:20

Python中文

2010-03-15 15:11:50

Python列表

2010-03-16 10:32:36

Java線程撥號(hào)器

2010-02-22 17:12:34

Python對(duì)象

2010-03-01 16:32:36

Python語(yǔ)言

2010-03-09 18:14:55

Python sock

2010-02-01 16:22:36

Python字符串操作

2010-03-01 11:06:52

Python 調(diào)試器

2010-03-15 15:45:15

Python編程語(yǔ)言

2010-03-16 17:39:36

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

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

主站蜘蛛池模板: 国产精品视频一区二区三区 | 亚洲欧美日韩国产 | 国产精品精品视频一区二区三区 | 成人国产一区二区三区精品麻豆 | 91精品国产777在线观看 | 久草精品在线 | 中文字幕在线视频免费观看 | 午夜一级做a爰片久久毛片 精品综合 | 亚洲色欲色欲www | 成人a视频在线观看 | 亚洲电影第三页 | 日韩精品极品视频在线观看免费 | 成年人免费在线视频 | 久久精品电影 | 午夜视频在线播放 | 天天操天天操 | 国产精品国产精品 | 中文字幕一区二区三区四区五区 | 麻豆久久久久久久 | 久久综合婷婷 | 久久久久久久国产 | 天天插天天干 | 羞羞视频免费观看 | 国产美女自拍视频 | 日本一区二区视频 | 日本一道本 | 免费看91 | 国产91在线 | 中日 | 国产高清自拍视频在线观看 | 天天干在线播放 | 亚洲精品一区二 | 狠狠久| 播放一级黄色片 | 欧美国产一区二区 | 日韩三级免费观看 | 日韩精品一区二区三区视频播放 | 国产高清精品一区二区三区 | 国产精品一区二区视频 | 五月婷婷婷 | 亚洲精品国产第一综合99久久 | 日韩在线观看网站 |