这是一项有风险的业务,我理解Global Interpreter Lock是并行主义的强大敌人。但是,如果我使用NumPy's C API(特别是NumPy数组上的PyArray_DATA
宏),是否可能会从多个并发线程调用它?[/ p>
请注意,我仍将拥有GIL,而不是使用NumPy's threading support发布它。此外,即使NumPy不保证线程安全,但PyArray_DATA
在实践中是线程安全的,对我来说足够好。
我在Linux上使用NumPy 1.3.0运行Python 2.6.6。
答案 0 :(得分:7)
在这里回答我自己的问题,但在深入研究NumPy 1.3.0的源代码后,我认为答案是:是的,PyArray_DATA
是线程安全的。
PyArray_DATA
定义于
ndarrayobject.h:
#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
PyArrayObject结构类型是 在同一个文件中定义;场 感兴趣的是:
char *data;
现在,问题是从多个线程访问data
是否安全。
从头开始创建一个新的NumPy数组(即,不从现有数据结构派生它)将NULL
数据指针传递给在arrayobject.c中定义的PyArray_NewFromDescr
。
这会导致PyArray_NewFromDescr
调用PyDataMem_NEW
以便为PyArrayObject的data
字段分配内存。这只是malloc的一个宏:
#define PyDataMem_NEW(size) ((char *)malloc(size))
总之,PyArray_DATA
是线程安全的,只要NumPy数组是单独创建的,就可以安全地从不同的线程写入它们。