Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Python bytearray的多线程访问_Python_Multithreading - Fatal编程技术网

对Python bytearray的多线程访问

对Python bytearray的多线程访问,python,multithreading,Python,Multithreading,似乎因为访问NumPy数组数据不需要调用Python解释器,所以C扩展可以在释放GIL后操作这些数组。例如,在 内置Python类型bytearray支持,其中一个成员是 无效*buf 指向所描述的逻辑结构开头的指针 缓冲区字段。[...] 对于连续数组,该值指向内存的开头 街区 我的问题是,C扩展能否在释放GIL(Py_BEGIN_ALLOW_THREADS)后处理这个buf,因为访问它不再需要调用Python C API?或者Python垃圾回收器的性质禁止这样做,因为bytearray及其

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

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

无效*buf

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


我的问题是,C扩展能否在释放GIL(Py_BEGIN_ALLOW_THREADS)后处理这个buf,因为访问它不再需要调用Python C API?或者Python垃圾回收器的性质禁止这样做,因为bytearray及其buf可能在执行过程中被移动?

为了澄清作为注释编写的简短回答:您可以在不持有GIL的情况下访问*buf数据,前提是您确定Py_缓冲区结构是“拥有的”在没有GIL的情况下,通过线程运行


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

Py_buffer结构持有引用,在释放所有缓冲区导出之前,
bytearray
无法调整大小(即,
ob_exports>0
)。谢谢-我认为这也意味着在导出缓冲区时GC不会移动buf(相对于释放)?Python是否使用了a?当引用计数达到0时,
bytearray
被释放。Python的GC试图解析容器类型(例如列表、类)中的引用周期。如果您对Python的对象内存分配策略感兴趣,中的注释将对其进行详细介绍。大于256字节的分配将被推送到
malloc
。对于小对象,内存从4个KiB池中分配。每个池都有一个存储类(随着池的重用而变化),块大小从8到256字节不等,是8的倍数。池从系统中分配到256 KiB竞技场。还请注意,中已更新为使用匿名
mmap
分配竞技场,以减少堆碎片(请参阅)。此外,最大块大小也从256字节增加到512字节,以更好地适应64位系统(例如,64位系统中的dict对象为280字节,之前会使用
malloc
)进行分配)。