如何进行Python主线程设置

开发 后端
你建立一个程序,就是一个进程,其中包含一个线程,这个就是Python主线程,那么创建的线程就是这个主线程的子线程。

下面给大家一个宝贵的建议,对于那些从来没有学习过编程或者并非计算机专业的编程学习者而言,Python主线程是最好的选择之一,并建议那些初学的程序员先从Python开始学习编程。

如果waitflag为0,Python会检查当前GIL是否可用,GIL中的owned是指示GIL是否可用的变量,在前面的InitializeNonRecursiveMutex中我们看到这个值被初始化为-1,Python会检查这个值是否为-1,如果是,则意味着GIL可用。

必须将其置为0,当owned为0后,表示该GIL已经被一个线程占用,不再可用。对于我们这里分析的调用PyEval_InitThread的主线程而言,由于在初始化GIL之后就调用PyThread_ acquire_lock申请GIL。

到这时,并没有第二个线程被创建,所以主线程会轻而易举地获得GIL的使用权。注意这里的检查和更新owned的操作是通过一个Win32的系统API——Interlocked- CompareExchange——来完成的。这个API是一个原子操作,其函数原形和功能如下。

与InterlockedCompareExchange相同的,InterlockedIncrement也是一个原子操作,其功能是将mutex->owned的值增加1。从这里可以看到,当一个线程开始等待GIL时,其owned就会被增加1。

显然我们可以猜测,当一个线程最终释放GIL时,一定会将GIL的owned减1,这样当所有需要GIL的线程都最终释放了GIL之后,owned会再次变为-1,意味着GIL再次变为可用。

为了清晰地展示这一点,我们现在就来看看PyThread_aquire_lock的逆运算,PyThread_release_lock每一个将从运行转态转为等待状态的线程都会在被挂起之前调用它以释放对GIL的占有。

  1. void PyThread_release_lock(PyThread_type_lock aLock)  
  2.  
  3. {  
  4.  
  5.     LeaveNonRecursiveMutex((PNRMUTEX) aLock);  
  6.  
  7. }  
  8.  
  9. BOOL LeaveNonRecursiveMutex(PNRMUTEX mutex)  
  10.  
  11. {  
  12.  
  13.     /* We don't own the mutex */  
  14.  
  15.     mutex->thread_id = 0 ;  
  16.  
  17.     return  
  18.  
  19.         InterlockedDecrement(&mutex->owned) < 0 ||  
  20.  
  21.         SetEvent(mutex->hevent) ; /* Other threads are waiting, wake one on  
  22.  
  23.            them up */  
  24.  
  25. }  

最终,一个线程在释放GIL时,会通过SetEvent通知所有在等待GIL的hevent这个Event内核对象的线程,结合前面的分析。如果这时候有线程在等待GIL的hevent,那么将被操作系统唤醒。这就是我们在前面介绍的Python主线程将线程调度的第二个难题委托给操作系统来实现的机制。

到了这时,调用PyEval_InitThread的线程(也就是Python主线程)已经成功获得了GIL,最后会调用PyThread_get_thread_ident(),通过Win32的API:GetCurrent- ThreadId,获得当前Python主线程的id。

【编辑推荐】

  1. 如何使Python嵌入C++应用程序?
  2. 深入探讨Ruby与Python语法比较
  3. Python学习资料介绍分享
  4. Python学习经验谈:版本、IDE选择及编码解决方案
  5. 浅析Python的GIL和线程安全
责任编辑:chenqingxiang 来源: 人民邮电出版社
相关推荐

2010-02-01 17:33:24

Python主线程

2010-03-10 19:34:45

Python主线程

2011-07-28 14:07:30

2010-02-26 15:37:11

Python主线程

2010-02-03 13:55:51

Python 代码

2010-02-22 16:05:40

Python配置

2010-02-01 10:21:36

Python编码转换

2009-08-06 15:03:11

行虚拟机Apache设

2010-02-01 18:20:17

Python 多重继承

2010-03-11 17:38:20

Python中文

2010-03-15 15:11:50

Python列表

2010-02-01 14:48:43

2010-05-27 16:18:58

SVN设置

2009-12-10 17:19:05

Visual Stud

2010-03-16 10:32:36

Java线程拨号器

2010-02-01 16:22:36

Python字符串操作

2010-03-15 15:45:15

Python编程语言

2010-03-01 11:06:52

Python 调试器

2010-02-22 17:12:34

Python对象

2010-03-01 16:32:36

Python语言
点赞
收藏

51CTO技术栈公众号