2010-12-05 64 views
6

這是危險的業務,我理解全球解釋器鎖是一個可怕的平行對手。但是,如果我使用NumPy's C API(特別是NumPy數組上的PyArray_DATA宏),是否可能會從多個併發線程中調用它?從多線程調用NumPy的C API函數有什麼含義?

請注意,我仍然擁有GIL,不會與NumPy's threading support發佈。另外,即使NumPy不保證線程安全,但PyArray_DATA在實踐中是線程安全的,對我來說已經足夠好了

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

回答

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數據指針傳遞給arrayobject.c中定義的PyArray_NewFromDescr

  4. 這會導致PyArray_NewFromDescr調用PyDataMem_NEW以便爲PyArrayObject的data字段分配內存。這是一個簡單的malloc的宏:

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

綜上所述,PyArray_DATA是線程安全的,只要與NumPy陣列單獨創建,它是安全的,從不同的線程寫信給他們。