27

信頼できるコーダーの友人が、Python の現在のマルチスレッド実装には深刻なバグがあると言いました。この噂について何が言えますか?

4

6 に答える 6

58

Python スレッドは、同時 I/O プログラミングに適しています。スレッドは、ファイルやネットワークなどからの入力の待機をブロックするとすぐに CPU からスワップ アウトされます。これにより、他の Python スレッドが待機中に CPU を使用できるようになります。これにより、たとえば、マルチスレッド Web サーバーや Web クローラーを作成できます。

ただし、Python スレッドは、インタープリター コアに入るときにGILによってシリアル化されます。これは、2 つのスレッドが数字を処理している場合、特定の瞬間に実行できるのは 1 つだけであることを意味します。また、マルチコアまたはマルチプロセッサ アーキテクチャを利用できないことも意味します。

C ベースのスレッド ライブラリを使用して、複数の Python インタープリターを同時に実行するなどのソリューションがあります。これは気弱な人向けではなく、そのメリットは苦労する価値がないかもしれません. 将来のリリースですべての Python ソリューションを期待しましょう。

于 2008-08-29T06:33:54.780 に答える
16

Python の標準実装 (一般に C で記述されているため、CPython として知られています) は OS スレッドを使用しますが、Global Interpreter Lockがあるため、一度に 1 つのスレッドのみが Python コードを実行できます。ただし、これらの制限内では、スレッド ライブラリは堅牢であり、広く使用されています。

複数の CPU コアを使用できるようにする場合は、いくつかのオプションがあります。1つは、他の人が述べたように、複数のpythonインタープリターを同時に使用することです。別のオプションは、GIL を使用しない Python の別の実装を使用することです。2 つの主要なオプションはJythonIronPythonです。

Jython は Java で書かれており、現在はかなり成熟していますが、いくつかの非互換性が残っています。たとえば、Web フレームワークのDjango はまだ完全には動作していませんが、常に近づいています。Jython は、スレッドの安全性に優れており、ベンチマークでより優れた結果を出し、GIL を必要としている人に生意気なメッセージを提供します

IronPython は .NET フレームワークを使用し、C# で記述されています。互換性は、 Django が IronPythonで (少なくともデモとして)実行できる段階に達しており、 IronPython でスレッドを使用するためのガイドがあります。

于 2008-08-29T17:17:18.527 に答える
9

GIL (Global Interpreter Lock) が問題かもしれませんが、API はまったく問題ありません。processing個別のプロセスに Threading API を実装する優れたモジュールを試してみてください。私は現在それを使用しており (OS X ではありますが、Windows ではまだテストを行っていません)、本当に感心しています。Queue クラスは、複雑さを管理するという点で私のベーコンを本当に節約しています!

EDIT : バージョン 2.6 ( import multiprocessing) の時点で、処理モジュールが標準ライブラリに含まれているようです。喜び!

于 2008-08-29T06:55:14.103 に答える
5

私が知る限り、実際のバグはありませんが、cPython でスレッド化するときのパフォーマンスは、GIL (Global Interpreterロック)、つまり、実際には言語固有ではなく実装固有です。たとえば、Jython は Java スレッド モデルを使用しているため、この問題に悩まされることはありません。

cPython 実装から GIL を削除することが現実的に不可能な理由については、この投稿を参照してください。実用的な詳細と回避策については、これを参照してください。

詳細については、 「Python GIL」をグーグルで検索してください。

于 2008-08-29T05:58:34.833 に答える
2

Python でコーディングして優れたスレッド サポートを得たい場合は、IronPython または Jython をチェックしてみてください。IronPython と Jython の Python コードは、それぞれ .NET CLR と Java VM で実行されるため、これらのライブラリに組み込まれた優れたスレッド サポートを利用できます。それに加えて、IronPython には GIL がありません。これは、CPython スレッドがマルチコア アーキテクチャを十分に活用できない問題です。

于 2009-02-23T06:15:07.290 に答える
-2

私はいくつかのアプリケーションでそれを使用してきましたが、その限界を知っている限り、スレッド化が 100% 信頼できるものであるということは聞いたことも聞いたこともありません。同時に 1000 個のスレッドを生成して、プログラムが Windows 上で適切に実行されることを期待することはできませんが、ワーカー プールを簡単に記述して、それに 1000 個の操作をフィードするだけで、すべてを適切に制御できます。

于 2008-08-29T05:50:47.817 に答える