当前位置:  开发笔记 > 编程语言 > 正文

并发:用C/C++编写的Python扩展是否受Global Interpreter Lock的影响?

如何解决《并发:用C/C++编写的Python扩展是否受GlobalInterpreterLock的影响?》经验,为你挑选了2个好方法。

Python最强大的一点是易于编写C和C++扩展,以加速处理器密集型代码部分.这些扩展可以避免全局解释器锁定还是受GIL限制?如果没有,那么这种"易于扩展"甚至比我之前意识到的更具杀伤力.我怀疑答案不是简单的是或否,但我不确定,所以我在StackOverflow上问这个问题.



1> Tim Lesher..:

是的,对C扩展的调用(从Python调用的C例程)仍然受GIL的约束.

但是,您可以在C扩展中手动释放GIL,只要在将控制权返回到Python VM之前要小心重新断言它.

有关信息,请查看Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS宏:http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock



2> Ted Dziuba..:

Python的C/C++扩展不受GIL的约束.但是,你真的需要知道你在做什么. 来自http://docs.python.org/c-api/init.html:

全局解释器锁用于保护指向当前线程状态的指针.释放锁并保存线程状态时,必须在释放锁之前检索当前线程状态指针(因为另一个线程可以立即获取锁并将其自己的线程状态存储在全局变量中).相反,当获取锁并恢复线程状态时,必须在存储线程状态指针之前获取锁.

为什么我要继续这么详细呢?因为当从C创建线程时,它们没有全局解释器锁,也没有针对它们的线程状态数据结构.这些线程必须首先创建一个线程状态数据结构,然后获取锁,最后存储它们的线程状态指针,然后才能开始使用Python/C API.完成后,他们应该重置线程状态指针,释放锁,最后释放他们的线程状态数据结构.


您是否正在考虑使用*嵌入*Python而不是C扩展的C代码?当Python解释器中的一个线程调用你的C扩展时,它仍然持有GIL,除非你专门发布它.你引用的部分是讨论在*Python之外创建的线程.
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有