複数のスレッドからnumpyのC API関数を呼び出すことの意味は何ですか?
-
08-10-2019 - |
質問
これは危険なビジネスであり、グローバルな通訳ロックが並列処理の手ごわい敵であることを理解しています。ただし、使用している場合 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
スレッドセーフです。
PyArray_DATA
ndarrayobject.hで定義されています:#define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
pyarrayobject structタイプは同じファイルで定義されています。関心のある分野は次のとおりです。
char *data;
だから今、問題はアクセスするかどうかです
data
複数のスレッドからは安全かどうか。ゼロから新しいnumpy配列を作成する(つまり、既存のデータ構造から導出されない)は、
NULL
データポインターPyArray_NewFromDescr
, 、arrayobject.cで定義されています。これは〜をひき起こす
PyArray_NewFromDescr
呼び出すPyDataMem_NEW
PyarrayObjectのメモリを割り当てるためdata
分野。これは単にmallocのマクロです:#define PyDataMem_NEW(size) ((char *)malloc(size))
要約すれば、 PyArray_DATA
スレッドセーフであり、numpy配列が個別に作成されている限り、異なるスレッドからそれらに書き込むことは安全です。