这是有风险的业务,我理解全球口译员锁定是一个强大的并行敌人。但是,如果我正在使用 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 是线程安全。

  1. PyArray_DATA 在ndarrayobject.h中定义:

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
    
  2. PyarrayObject结构类型在同一文件中定义;感兴趣的领域是:

    char *data;
    

    所以现在,问题是是否访问 data 多线程是否安全。

  3. 从头开始创建一个新的numpy数组(即,不从现有数据结构派生)通过 NULL 数据指针 PyArray_NewFromDescr, ,在arrayObject.c中定义。

  4. 这引起 PyArray_NewFromDescr 调用 PyDataMem_NEW 为了分配pyarrayObject的内存 data 场地。这只是Malloc的宏:

    #define PyDataMem_NEW(size) ((char *)malloc(size))
    

总之, PyArray_DATA 是线程安全的,只要单独创建numpy阵列,就可以安全地从不同的线程写给它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top