26

Pythonスレッドは、Javaと同様に、メモリの可視性とステートメントの並べ替えの問題を明らかにしますか?多くの人がマルチスレッドのPythonコードを書いているにもかかわらず、「Pythonメモリモデル」などへの参照が見つからないため、これらの落とし穴はここには存在しないと思います。たとえば、volatileキーワードはありません。しかし、たとえば、あるスレッドの変数の変更が他のすべてのスレッドにすぐに表示されることは、どこにも明示的に述べられていないようです。

たぶん、これはすべてPythonプログラマーにとって非常に明白ですが、恐ろしいJavaプログラマーとして、私は少し余分な安心感が必要です:)

4

1 に答える 1

23

Pythonのスレッド化の正式なモデルはありません(結局のところ、Javaのスレッド化のモデルは何年もありませんでした...うまくいけば、最終的にはPython用に作成されることもあります)。

実際には、ステートメントの並べ替えや一時的に共有変数をスレッドローカル変数として扱うなどの高度な最適化を実行するPython実装はありません。これらのセマンティクスの制約は、正式に保証されていなくても信頼できます。

特にCPythonは、@ Rawheiserが言及しているように、グローバルインタープリターロックを使用します。他の実装(PyPy、IronPython、Jythonなど)はそうではありません(したがって、CPythonは同じ目的でマルチプロセッシングを必要としますが、スレッドモデルで複数のコアを効果的に使用できます)。 Pythonの実装全体で移植可能なコードを記述します。(したがって、辞書アクセスなど、GILのためにCPythonでのみアトミックになる操作の「アトミック性」を当てにするべきではありません。他のPython実装では、複数のスレッドが一度にdictを変更し、原因となる可能性があります。ロックなどで辞書を保護しない限り、エラーが発生します)。

于 2010-08-23T17:11:39.820 に答える