如何进行Python主线程设置
创始人
2024-06-22 12:20:09
0

下面给大家一个宝贵的建议,对于那些从来没有学习过编程或者并非计算机专业的编程学习者而言,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和线程安全

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...