从多个线程调用Numpy的C API函数的含义是什么?
-
08-10-2019 - |
题
这是有风险的业务,我理解全球口译员锁定是一个强大的并行敌人。但是,如果我正在使用 Numpy的C API (特别是 PyArray_DATA
宏观阵列上的宏,从多个并发线程调用它是否有潜在的后果?
请注意,我仍然会拥有GIL,而不会释放它 Numpy的线程支持. 。另外,即使Numpy不能保证线程安全,但 PyArray_DATA
在实践中是线程安全的 对我来说已经足够了.
我正在Linux上运行带有Numpy 1.3.0的Python 2.6.6。
解决方案
在这里回答我自己的问题,但是在戳入numpy 1.3.0的源代码之后,我相信答案是: 是的, PyArray_DATA
是线程安全。
PyArray_DATA
在ndarrayobject.h中定义:#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
PyarrayObject结构类型在同一文件中定义;感兴趣的领域是:
char *data;
所以现在,问题是是否访问
data
多线程是否安全。从头开始创建一个新的numpy数组(即,不从现有数据结构派生)通过
NULL
数据指针PyArray_NewFromDescr
, ,在arrayObject.c中定义。这引起
PyArray_NewFromDescr
调用PyDataMem_NEW
为了分配pyarrayObject的内存data
场地。这只是Malloc的宏:#define PyDataMem_NEW(size) ((char *)malloc(size))
总之, PyArray_DATA
是线程安全的,只要单独创建numpy阵列,就可以安全地从不同的线程写给它们。
不隶属于 StackOverflow