24

wxPython インターフェイスを使用して、Python でシミュレーションを実行するためのプログラムを作成しています。プログラムでは、シミュレーションを作成することができ、プログラムはそれをレンダリング (=計算) します。レンダリングには非常に時間がかかる場合があります。

ユーザーがシミュレーションを開始し、初期状態を定義するとき、ユーザーがプログラムでさまざまなことをしている間、プログラムがバックグラウンドでシミュレーションを継続的にレンダリングするようにします。いっぱいになる YouTube スタイルのバーのようなもの: レンダリングされたポイントまでしかシミュレーションを再生できません。

複数のプロセスまたは複数のスレッドを使用する必要がありますか? 人々は私にこのmultiprocessingパッケージを使うように言ったので、私はそれをチェックアウトし、良さそうに見えましたが、スレッドとは異なり、プロセスは多くの情報を共有できないとも聞きました (そして、私のプログラムは多くの情報を共有する必要があると思います. ) さらに、Stackless Python についても聞きました。別のオプションですか? 何も思いつきません。

お知らせ下さい。

4

9 に答える 9

14

今年の Pycon では、マルチプロセッシングについて良い話がありました。重要なメッセージは、「マルチプロセッシングで解決できる問題、またはスレッドでは解決できない問題があることが確実でない限り、マルチプロセッシングのみを使用してください。それ以外の場合は、スレッドを使用してください」でした。

プロセスには多くのオーバーヘッドがあり、プロセス間で共有されるすべてのデータはシリアライズ可能 (つまり、ピクル可能) である必要があります。

ここでスライドとビデオを見ることができます: http://blip.tv/pycon-us-videos-2009-2010-2011/introduction-to-multiprocessing-in-python-1957019

http://us.pycon.org/2009/conference/schedule/event/31/

于 2009-04-09T01:21:33.620 に答える
14
  • スタックレス: 1 CPU を使用します。「タスクレット」は自発的に降伏する必要があります。プリエンプション オプションは常に機能するとは限りません。
  • スレッド化: 1 つの CPU を使用します。ネイティブ スレッドは、20 ~ 100 個の Python オペコードを実行した後、多少ランダムに時間を共有します。
  • マルチプロセッシング: 複数の CPU を使用

アップデート

詳細な分析

簡単な時間のためにスレッドを使用してください。ただし、戻るまでに時間がかかるC ルーチンを呼び出す場合、C ルーチンがロックを解放しない場合、これは選択できない可能性があります。

CPU パワーによって非常に制限されていて、最大限の応答性が必要な場合は、マルチプロセッシングを使用してください。

スタックレスを使用しないでください。以前に segfault を使用したことがあり、数百以上のスレッドを使用していない限り、スレッドはほとんど同等です。

于 2009-04-08T22:22:13.757 に答える
5

CPythonでは、GIL: link textのため、複数のスレッドを同時に実行することはできません。

スレッドがアプリケーションを後押しする可能性はまだあると思います。たとえば、別のスレッドが何らかの作業を行っているときに、スレッドがI/Oをブロックする可能性があります。

スレッドを使用したことがない場合は、最初にスレッドを試すことをお勧めします。それは他のどの言語でも役に立ちます、そしてあなたはウェブ上にたくさんのリソースを見つけるでしょう。次に、より多くの並列処理が必要であることに気付いた場合でも、プロセスに戻すことができます。

于 2009-04-08T22:41:01.183 に答える
1

私は単純にするために常に複数のスレッドを好みますが、アフィニティーには実際の問題があります。Python のスレッド化実装に特定のプロセッサにバインドするように指示する (私が知っている) 方法はありません。これはあなたにとって問題ではないかもしれません。正当な理由がない限り、問題は Python のスレッド実装で簡単に解決できるようです。

処理済みの使用を決定した場合、サブプロセス間で情報を共有するには、いくつかの方法があります: tcp/udp 接続、共有メモリ、またはパイプ。多少のオーバーヘッドと複雑さが追加されます。

于 2009-04-08T21:52:44.403 に答える
1

非常に困惑。Bastien Léonard は、GIL が有用な方法でスレッドを使用する機能を停止することを正しく指摘しました。彼の参考文献は次のように述べています。

「言語でグローバルインタープリターロックを使用すると、複数のスレッドを持つ単一のインタープリタープロセスの同時実行によって到達可能な並列処理の量が効果的に制限されます。プロセスがほぼ純粋にインタープリターコードで構成されており、インタープリターの外部で長時間呼び出しを行わない場合。 (そのスレッドの処理中に GIL のロックを解放することができる) の期間、マルチプロセッサ マシンでプロセスを実行する場合、速度はほとんど向上しない可能性があります。単一のプロセッサでも、大幅な速度低下を引き起こす可能性があります。」

この場合、マルチプロセッシングは賢明な選択です。私自身の経験から、Python + MT はユーザーにとって目立った利点はありません。

于 2016-03-13T16:01:39.027 に答える
0

スレッド化が必要なようです。

あなたが説明したように、実際に多くの CPU を使用する 1 つのことがあったように聞こえました...実際のシミュレーションの実行です。

取得しようとしているのは、シミュレーションの実行中にユーザーの操作とグラフィックスの更新を許可することにより、より応答性の高いディスプレイです。これはまさに、Python のスレッド化が構築された目的です。

これで得られないのは、システム上の複数のコア/プロセッサを利用する機能です。シミュレーションがどのように見えるかはわかりませんが、CPU を集中的に使用する場合は、分割するのに適している可能性があります。この場合、マルチプロセッシングを使用して、別々のコア/プロセッサでシミュレーションの別々の部分を実行できます。ただし、これは簡単なことではありません...別々のプロセスが同じメモリ空間に簡単にアクセスできないため、プロセス間でデータをやり取りする何らかの方法が必要になります。

于 2009-04-09T16:17:00.057 に答える