对Python bytearray的多线程访问

时间:2012-11-06 04:22:28

标签: python multithreading

似乎由于访问NumPy数组数据不需要调用Python解释器,C扩展可以在释放GIL后操作这些数组。例如,在this thread

内置的Python类型bytearray支持Buffer Protocol,其中一个成员是

  

无效 * buf

     

指向由...描述的逻辑结构的开头的指针   缓冲区域。 [...]   对于连续数组,该值指向内存的开头   块。

我的问题是,在发布GIL(Py_BEGIN_ALLOW_THREADS)之后,C扩展是否可以操作此 buf ,因为访问它不再需要调用Python C API?或者Python垃圾收集器的性质是否禁止这样做,因为在执行期间可能会移动bytearray及其buf?

1 个答案:

答案 0 :(得分:3)

澄清作为注释写的简短答案:你可以在不保存GIL的情况下访问* buf数据,前提是你确定Py_buffer结构在没有GIL的情况下由线程“拥有”。

为了完整起见,我应该补充一点,这可能会打开(非常远程)崩溃风险的大门:如果无GIL线程在* buf读取数据,同时另一个GIL持有线程正在运行Python代码更改相同的数据(bytearray [index] = x),然后无GIL的线程可以看到脚下的数据意外更改。相反的情况也是如此,甚至更烦人(但仍然是理论上的):如果无GIL的线程在* buf处更改数据,那么其他持有GIL的,运行Python的线程可能会看到奇怪的结果,甚至可能会在执行某些操作时崩溃复杂的读取操作,如bytearray.split()。