从多个线程调用NumPy的C API函数有什么含义?

时间:2010-12-05 10:22:24

标签: python numpy python-c-api gil

这是一项有风险的业务,我理解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。

1 个答案:

答案 0 :(得分: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数据指针传递给在arrayobject.c中定义的PyArray_NewFromDescr

  4. 这会导致PyArray_NewFromDescr调用PyDataMem_NEW以便为PyArrayObject的data字段分配内存。这只是malloc的一个宏:

    #define PyDataMem_NEW(size) ((char *)malloc(size))
    
  5. 总之,PyArray_DATA是线程安全的,只要NumPy数组是单独创建的,就可以安全地从不同的线程写入它们。