如果没有,有没有办法通过某种方式编程来保证线程安全?
澄清一下,在谈论“线程安全”时,我指的是 Python 线程,而不是操作系统级线程。
如果没有,有没有办法通过某种方式编程来保证线程安全?
澄清一下,在谈论“线程安全”时,我指的是 Python 线程,而不是操作系统级线程。
这一切都取决于您的 Cython 代码和 Python 的 GIL 之间的交互,如此处详细记录的那样。如果您不做任何特别的事情,Cython 生成的代码将尊重 GIL(不使用 GIL 释放宏的 C 编码扩展也是如此);这使得这样的代码“像 Python 代码一样线程安全”——这并不多,但比完全自由线程代码更容易处理(您仍然需要构建多线程协作和同步,理想情况下使用 Queue 实例但可能使用锁定 &c)。
已放弃 GIL 但尚未将其取回的代码不得以任何方式与 Python 运行时和 Python 运行时使用的对象进行交互——这适用于 Cython 以及 C 编码的扩展。它的好处当然是这样的代码可以在单独的核心上运行(当然,直到它需要同步或以任何方式再次与 Python 运行时通信)。
Python 的全局解释器锁意味着任何时候在解释器中只能有一个线程处于活动状态。但是,一旦将控制权传递给 C 扩展,解释器中的另一个线程就可以处于活动状态。可以创建多个线程,并且没有什么可以阻止线程在临界区中间被中断。ñ
线程安全的代码可以在解释器中实现,因此在解释器中运行的代码本身就不是线程安全的。C 或 Pyrex 模块中的代码仍然可以修改 Python 代码可见的数据结构。当然,本机代码也可能存在本机数据结构的线程问题。
除了使用适当的设计和同步之外,您无法保证线程安全——python 解释器上的 GIL 并没有实质性地改变这一点。