複数のスレッドからnumpyのC API関数を呼び出すことの意味は何ですか?

StackOverflow https://stackoverflow.com/questions/4358320

質問

これは危険なビジネスであり、グローバルな通訳ロックが並列処理の手ごわい敵であることを理解しています。ただし、使用している場合 NumpyのC API (具体的には PyArray_DATA Numpyアレイのマクロ)、複数の同時スレッドからそれを呼び出すことに潜在的な結果がありますか?

私はまだギルを所有していて、それをリリースしないことに注意してください 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 structタイプは同じファイルで定義されています。関心のある分野は次のとおりです。

    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