5

NumPy 配列データへのアクセスには Python インタープリターへの呼び出しが必要ないため、C 拡張機能は GIL のリリース後にこれらの配列を操作できるようです。たとえば、このスレッドで。

組み込みの Python 型 bytearray はBuffer Protocolをサポートしており、そのメンバーの 1 つは

ボイド*buf

バッファー フィールドによって記述された論理構造の先頭へのポインター。[...] 連続した配列の場合、値はメモリ ブロックの先頭を指します。

私の質問は、C 拡張機能は、GIL (Py_BEGIN_ALLOW_THREADS) を解放した後、このbufを操作できますか? それとも、実行中に bytearray とその buf が移動される可能性があるため、Python ガベージ コレクターの性質上、これが禁止されているのでしょうか?

4

1 に答える 1

3

コメントとして書かれた短い答えを明確にするために:GILなしで実行されている間、Py_buffer構造体がスレッドによって「所有」されていることが確実であれば、GILを保持せずに *buf データにアクセスできます。

完全を期すために、これにより (非常にリモートの) クラッシュのリスクが発生する可能性があることを付け加えておきます。GIL を使用しないスレッドが *buf でデータを読み取り、同時に別の GIL を保持するスレッドが Python コードを実行している場合同じデータ (bytearray[index]=x) を変更すると、GIL を使用しないスレッドは、その足元にあるデータの予期しない変更を確認できます。逆もまた真であり、さらに煩わしい (ただし理論上は): GIL を使用しないスレッドが *buf でデータを変更すると、他の GIL を保持する Python 実行スレッドが奇妙な結果を表示するか、何かを実行するとクラッシュする可能性さえあります。 bytearray.split() のような複雑な読み取り操作。

于 2012-11-06T11:25:55.153 に答える