7

这是一项有风险的业务,我理解 Global Interpreter Lock 是并行性的强大敌人。但是,如果我使用NumPy 的 C API(特别PyArray_DATA是 NumPy 数组上的宏),从多个并发线程调用它是否有潜在的后果?

请注意,我仍将拥有 GIL,而不是通过NumPy 的线程支持发布它。此外,即使 NumPy 不保证线程安全但PyArray_DATA在实践中是线程安全的,这对我来说已经足够了

我在 Linux 上运行 Python 2.6.6 和 NumPy 1.3.0。

4

1 回答 1

7

在这里回答我自己的问题,但是在探究 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 数组是单独创建的,从不同线程写入它们是安全的。

于 2010-12-05T11:30:37.393 回答