13

コンピュータ シミュレーションを扱うPython プロジェクトを開発しており、そのための GUI も開発しています。(コア ロジック自体は GUI を必要としません。) 私が使用する GUI ツールキットは wxPython ですが、私の質問はそれに依存しないほど一般的だと思います。

GUI が現在動作する方法は、GUI とgarlicsim同じプロセスおよび同じスレッドでコア ロジック パッケージ (と呼ばれる) を開始することです。これは機能しますが、問題のあるアプローチであることは理解しています。なぜなら、コア ロジックが難しい計算を行う必要がある場合、GUI がハングするためです。これは受け入れられないと考えています。

私は何をすべきか?

GUI とは別のプロセスでコア ロジックを起動するオプションがあると聞きました。これは興味深いように聞こえますが、これについて多くの質問があります。

  1. multiprocessingパッケージまたはパッケージを使用しsubprocessて新しいプロセスを起動しますか?
  2. GUI プロセスからシミュレーション データに簡単にアクセスするにはどうすればよいですか? 結局のところ、それは他のプロセスに保存されます。ユーザーは、シミュレーションのタイムラインを簡単かつスムーズに閲覧できる必要があります。これはどのように行うことができますか?
4

5 に答える 5

6

http://wiki.wxpython.org/LongRunningTasksでインスピレーションが得られるかもしれませんが、マルチプロセッシングではなくマルチスレッド用です。

基本的な考え方

  • マルチスレッドの場合: イベント キューを使用して、GUI と処理スレッドの間で通信します。
  • マルチプロセッシングの場合: subprocessパッケージを使用し、子プロセスのstdin/stdoutを使用して通信します。これにはコマンドライン API が必要ですが、GUI に依存しない単体テストを実行できるため、最終的には便利になります。

ソケットを介して I/O 通信を駆動することもできます。これにより、シミュレーションのネットワーク管理が容易になります。

編集:あなたが言及した 2.6-new multiprocessingパッケージを見たところです。良い選択のようです。キューを使用してプロセス間で通信できます。これはより緊密な結合であり、ニーズに基づいて選択できます。

于 2009-12-25T14:09:54.587 に答える
2

具体的な質問に答える。

multiprocessingパッケージを使用するsubprocessか、新しいプロセスを起動するためにパッケージを使用するか?」

使用するmultiprocessing

「GUI プロセスからシミュレーション データに簡単にアクセスするにはどうすればよいですか?」

それがあなたが求めているものである場合、シミュレーションプロセスオブジェクトにアクセスすることはできません。シミュレーションは別のプロセスです。開始、停止、そして最も重要なこととして、シミュレーターに送られるコマンドのキューを介して要求を行うことができます。

「ユーザーは、シミュレーションのタイムラインを簡単かつスムーズに閲覧できる必要があります。これを行うにはどうすればよいでしょうか?」

これは単なるデザインです。単一プロセス、複数プロセス、複数スレッドは、この質問にはまったく影響しません。

各シミュレーションにはいくつかのパラメーターが必要であり、開始する必要があり、ログ (またはタイムライン) を生成する必要があります。シミュレーションの開始と停止に使用するライブラリに関係なく、これを行う必要があります。

GUI への入力であるシミュレーションからの出力は、100 万通りの方法で実行できます。

  • データベース。シミュレーション タイムラインを SQLite データベースに挿入し、GUI でクエリを実行できます。SQLite には本当に賢いロック機能がないため、これはうまくいきません。しかし、それは機能します。

  • ファイル。シミュレーション タイムラインはファイルに書き込まれます。GUI がファイルを読み取ります。これは本当にうまくいきます。

  • 要求/応答。シミュレーションには複数のスレッドがあり、そのうちの 1 つはコマンドをキューから取り出して応答します。たとえば、その時点までのタイムラインを送り返すか、シミュレーションを停止するか、パラメータを変更して再起動します。

于 2009-12-25T14:43:30.960 に答える
2

ここで有効な最も簡単な方法は、別のスレッドで計算を開始し、Queueオブジェクトを使用してこのスレッドと GUI の間でデータを通信することです。これらは完全に安全で、スレッド間通信に非常に便利です。

他のソリューションはより複雑です。完全に別の「サーバー」プロセスでシミュレーションを実行し、メイン GUI でソケットと通信することになる場合があります。

于 2009-12-25T15:00:20.267 に答える
1

残念ながら、GUI の選択が答えに影響しないというあなたの意見は正しいですが、この問題への最善のアプローチは、シミュレーション データが正確に何をしているかに大きく依存します。

たとえば、シーケンシャル データを生成する場合は、スレッド セーフまたはプロセス セーフのキューを介して GUI にフィードできます。しかし、それがデータ全体を変更し、GUI がいつでもスナップショットを表示できるようにする必要がある場合、キューに沿って状態全体を送信することで解決するにはコストがかかりすぎる可能性があり、アクセスを共有する代わりにミューテックス スタイルのアプローチが必要になる可能性があります。データ構造に。したがって、ここではデータに対して行われる作業の性質が最も重要です。

マルチプロセッシングとサブプロセスのどちらを使用するかについては、完全に別のプログラムを使用するか、データを処理しないかによって異なります。前者は、マルチスレッドのスタイルでマルチプロセッシングを行うためのものです。これは、複数のプロセスで実行される同じプログラムの異なる部分です。後者は、あるプログラムが別のプログラムを実行したい場合です (これはプログラムのコピーである可能性がありますが、通常はそうではありません)。繰り返しになりますが、特定の状況に最適なアプローチを知ることは困難ですが、コア ロジックをコマンド ライン アプリケーションとして使用し、パイプやソケットなどを介して通信できるように思えます。

于 2009-12-25T14:40:55.630 に答える