4

タイトルが言うように、Python cStringIOはマルチスレッドで使用するために内部構造を保護しますか?

ありがとうございました。

4

4 に答える 4

4

PythonのCPython実装について話していると思います。

CPythonには、グローバルインタープリターロックがあります。これは、Pythonコードの単一スレッドのみが一度に実行できることを意味します。したがって、Cで記述されたコードも、グローバルロックを明示的に解放しない限り、事実上シングルスレッドになります。

つまり、複数のPythonスレッドがすべてcStringIOを同時に使用している場合、一度にアクティブにできるのはcStringIOメソッドへの1回の呼び出しのみであり、cStringIOがロックを解放することはないため問題はありません。ただし、ロックされた環境の外部で実行されているCコードから直接呼び出すと、問題が発生します。また、単に読み取りまたは書き込みよりも複雑なことを行うと、問題が発生します。たとえばseek、呼び出しが予期しない方法で重複する可能性があるため、使用を開始した場合です。

また、などの一部のメソッドwritelinesは、メソッド内からPythonコードを呼び出すことができるため、その場合、への1回の呼び出し内で他の出力がインターリーブされる可能性があることに注意してくださいwritelines

これは、ほとんどの標準Pythonオブジェクトに当てはまります。個々の操作が中断されないため、複数のスレッドのオブジェクトを安全に使用できますが、発生する順序は定義されません。

于 2011-05-13T12:21:41.693 に答える
4

GILの説明に関する優れた作業を見てから、cStringIOは純粋にCで記述されており、その呼び出しはGILを解放しないことに注意してください。

これは、実行中のスレッドがread()/ write()中に自発的に切り替わらないことを意味します(現在の仮想マシンの実装では)。(OSはスレッドをプリエンプトしますが、他のPythonスレッドはGILを取得できません。)

ソースを見てみましょう:Python-2.7.1 / Modules/cStringIO.c内部保護についての言及はありません。疑わしい場合は、ソースを見てください:)

于 2011-05-13T12:54:46.893 に答える
1

これは、ファイル操作が可能なのと同じくらい「スレッドセーフ」です(つまり、それほど多くはありません)。使用しているPython実装には、グローバルインタープリターロック(GIL)があります。これにより、上の個々のファイル操作cStringIOが別のスレッドによって中断されないことが保証されます。ただし、これは、複数のスレッドからの同時ファイル操作がインターリーブされないことを保証するものではありません。

于 2011-05-13T12:37:16.613 に答える
0

いいえ、現在スレッドセーフではありません。

于 2011-05-13T12:16:49.353 に答える