タイトルが言うように、Python cStringIOはマルチスレッドで使用するために内部構造を保護しますか?
ありがとうございました。
タイトルが言うように、Python cStringIOはマルチスレッドで使用するために内部構造を保護しますか?
ありがとうございました。
PythonのCPython実装について話していると思います。
CPythonには、グローバルインタープリターロックがあります。これは、Pythonコードの単一スレッドのみが一度に実行できることを意味します。したがって、Cで記述されたコードも、グローバルロックを明示的に解放しない限り、事実上シングルスレッドになります。
つまり、複数のPythonスレッドがすべてcStringIOを同時に使用している場合、一度にアクティブにできるのはcStringIOメソッドへの1回の呼び出しのみであり、cStringIOがロックを解放することはないため問題はありません。ただし、ロックされた環境の外部で実行されているCコードから直接呼び出すと、問題が発生します。また、単に読み取りまたは書き込みよりも複雑なことを行うと、問題が発生します。たとえばseek
、呼び出しが予期しない方法で重複する可能性があるため、使用を開始した場合です。
また、などの一部のメソッドwritelines
は、メソッド内からPythonコードを呼び出すことができるため、その場合、への1回の呼び出し内で他の出力がインターリーブされる可能性があることに注意してくださいwritelines
。
これは、ほとんどの標準Pythonオブジェクトに当てはまります。個々の操作が中断されないため、複数のスレッドのオブジェクトを安全に使用できますが、発生する順序は定義されません。
GILの説明に関する優れた作業を見てから、cStringIOは純粋にCで記述されており、その呼び出しはGILを解放しないことに注意してください。
これは、実行中のスレッドがread()/ write()中に自発的に切り替わらないことを意味します(現在の仮想マシンの実装では)。(OSはスレッドをプリエンプトしますが、他のPythonスレッドはGILを取得できません。)
ソースを見てみましょう:Python-2.7.1 / Modules/cStringIO.c内部保護についての言及はありません。疑わしい場合は、ソースを見てください:)
これは、ファイル操作が可能なのと同じくらい「スレッドセーフ」です(つまり、それほど多くはありません)。使用しているPython実装には、グローバルインタープリターロック(GIL)があります。これにより、上の個々のファイル操作cStringIO
が別のスレッドによって中断されないことが保証されます。ただし、これは、複数のスレッドからの同時ファイル操作がインターリーブされないことを保証するものではありません。
いいえ、現在スレッドセーフではありません。