Python扩展是由Cython / Pyrex线程安全生成的吗?

时间:2009-09-09 07:04:55

标签: python thread-safety cython pyrex

如果没有,有没有办法通过某种方式编程来保证线程安全?

澄清一下,在谈论“线程安全”时,我指的是Python线程,而不是操作系统级别的线程。

2 个答案:

答案 0 :(得分:5)

这完全取决于你的Cython代码和Python的GIL之间的交互,详见here。如果你没有做任何特殊的事情,Cython生成的代码将尊重GIL(与不使用GIL释放宏的C编码扩展一样);这使得这些代码“像Python代码一样线程安全” - 这不是很多,但比完全自由线程代码更容易处理(你仍然​​需要构建多线程协作和同步,理想情况下是Queue实例,但可能与锁定& c)。

放弃GIL并且尚未获得它的代码绝不能以任何方式与Python运行时和Python运行时使用的对象进行交互 - 这对于Cython和C编码扩展都是如此。它的好处当然是这样的代码可以在一个单独的核心上运行(当然,它需要同步或以任何方式再次与Python运行时通信)。

答案 1 :(得分:2)

Python的全局解释器锁意味着在任何时候只有一个线程可以在解释器中处于活动状态。但是,一旦将控制权传递给C扩展名,另一个线程就可以在解释器中处于活动状态。可以创建多个线程,并且不会阻止线程在关键部分的中间被中断。 Ñ

线程安全代码上的

可以在解释器中实现,因此在解释器中运行的代码的任何内容都不具有线程安全性。 C或Pyrex模块中的代码仍然可以修改python代码可见的数据结构。当然,本机代码也可能存在本机数据结构的线程问题。

除了使用适当的设计和同步之外,你不能保证线程安全 - python解释器上的GIL不会实质性地改变它。