問題タブ [multiprocessing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parallel-processing - マルチコアのMPI?
マルチコア プログラミングに関する最近の話題で、MPIを使用する可能性を探っている人はいますか?
python - Python 2.6 multiprocessing.Queue はスレッドと互換性がありますか?
Python 2.6 の新しい multiprocessing モジュールを試しています。それぞれ独自の multiprocessor.JoinableQueue インスタンスを持ついくつかのプロセスを作成しています。__init__
各プロセスは、JoinableQueue インスタンス (各 Thread のメソッドを介して渡される) を共有する 1 つ以上のワーカー スレッド (threading.Thread のサブクラス) を生成します。通常は機能しているように見えますが、時折、予期せずに次のエラーで失敗します。
私の Queue get() と task_done() 呼び出しは互いにすぐ後にあるので、それらは等しいはずです。逸話的に、これは get() と task_done() の間で行われる作業が非常に速い場合にのみ発生するようです。小さいtime.sleep(0.01)
ものを挿入すると、問題が軽減されるようです。
何が起こっているのですか?従来のキュー (Queue.Queue) の代わりに、マルチプロセッサ キューをスレッドで使用できますか?
ありがとう!
-ブライアン
python - Python 処理/マルチプロセッシング リスナー接続を受け入れて閉じる適切な方法
(この例ではpyprocessingモジュールを使用していますが、処理を multiprocessing に置き換えると、 python 2.6を実行するかmultiprocessing backportを使用する場合におそらく機能するはずです)
私は現在、UNIXソケットをリッスンし(processing.connection.Listenerを使用)、接続を受け入れ、リクエストを処理するスレッドを生成するプログラムを持っています。ある時点でプロセスを正常に終了したいのですが、accept() 呼び出しがブロックされているため、うまくキャンセルする方法がありません。少なくともここ(OS X)で機能する方法が1つあります。シグナルハンドラーを設定し、次のように別のスレッドからプロセスにシグナルを送信します。
私が考えた他の唯一の方法は、接続 (listener._listener._socket) の奥深くに到達し、非ブロック オプションを設定することです...しかし、それにはおそらくいくつかの副作用があり、一般的に本当に怖いです。
これを達成するためのよりエレガントな(そしておそらく正しい!)方法を誰かが持っていますか?OS X、Linux、BSD への移植性が必要ですが、Windows への移植性などは必要ありません。
明確化:ありがとうございます!いつものように、私の元の質問のあいまいさが明らかになりました:)
- リスニングをキャンセルした後にクリーンアップを実行する必要があり、そのプロセスを実際に終了したいとは限りません。
- 同じ親から生成されていない他のプロセスからこのプロセスにアクセスできるようにする必要があるため、キューが扱いにくくなります
- スレッドの理由は次のとおりです。
- それらは共有状態にアクセスします。実際には多かれ少なかれ一般的なメモリ内データベースなので、別の方法で実行できると思います。
- 同時に複数の接続を受け入れることができる必要がありますが、実際のスレッドはほとんどの場合、何かをブロックしています。受け入れられた接続ごとに、新しいスレッドが生成されます。これは、I/O ops ですべてのクライアントをブロックしないようにするためです。
スレッドとプロセスに関しては、スレッドを使用してブロッキング ops を非ブロッキングにし、プロセスを使用してマルチプロセッシングを有効にします。
perl - 大量のメモリを使用する Perl デーモン内で複数のソケットを処理するにはどうすればよいですか?
IO::Socket::INET を使用して、Perl でクライアント サーバー プログラムを作成しました。CGI ベースのサイトからサーバーにアクセスします。サーバー プログラムはデーモンとして実行され、複数の同時接続を受け入れます。私のサーバー プロセスは、約 100MB のメモリ空間を消費します (9 つの大きな配列、多くの配列...)。これらのハッシュをメモリに常駐させて共有し、接続ごとにハッシュを作成する必要がないようにしたいと考えています。ハッシュの作成には 10 ~ 15 秒かかります。
ソケットを介して新しい接続が受け入れられるたびに、新しいプロセスをフォークして、受信した各接続の処理を処理します。親プロセスは巨大であるため、フォークするたびに、プロセッサは新しい子プロセスにメモリを割り当てようとしますが、メモリが限られているため、新しい子プロセスを生成するのに時間がかかり、応答時間が長くなります。1回の接続でも何度もハングアップします。
親プロセスは 9 つの大きなハッシュを作成します。子ごとに、読み取り専用モードで 1 つ以上のハッシュを参照する必要があります。子を通じてハッシュを更新しません。親によって作成された 100 MB 全体またはグローバル変数全体をすべての子と共有できるコピー オン ライトのようなものを使用したいですか? またはスレッドのような他のメカニズム。サーバーは 1 秒あたり最低 100 のリクエストを受け取り、それらすべてを並行して処理できるはずです。平均して、子供は 2 秒で退出します。
Windows XP で Cygwin を使用しており、RAM は 1GB しかありません。この問題を克服する方法が見つかりません。何か提案できますか?変数を共有し、1 秒あたり 100 個の子プロセスを作成して管理し、同期するにはどうすればよいですか?
ありがとう。
python - プログラムがクラッシュしない限り、子マルチプロセッシングからの印刷出力はありません。
Pythonマルチプロセッシングモジュールに問題があります。Process
2番目のコアを利用するために、クラスを使用して新しいプロセスを生成しています。この2番目のプロセスは、大量のデータをRAMにロードし、消費するのではなく辛抱強く待機します。
そのプロセスがコマンドで何を出力するかを確認したかったのですがprint
、出力されるものは何も表示されません。親プロセスが出力するものだけが表示されます。彼らは2つの異なるプロセスに住んでいるので、これは私には理にかなっています。2番目のプロセスは、独自のシェル/標準出力ウィンドウを生成せず、その出力も親に送信されません。しかし、このプロセスがクラッシュすると、スクリプトが出力するように指示したすべてのものに加えて、スタックトレースとエラーが出力されます。
子プロセスの印刷出力を最初のプロセスに送信する簡単な方法があるのか、それともデバッグできるようにシェル/標準出力を生成する方法があるのか疑問に思っています。親に印刷を送信して標準出力に印刷できるようにするための専用の印刷物を作成できることは知ってmultiprocessing.Queue
いますが、より単純な解決策が存在する場合、これを行う気はありません。
python - Linuxでマルチプロセッシングを使用すると、TKinterウィンドウが表示されない
アプリケーションの残りの部分が続行している間、非同期でエラーメッセージを表示する別のプロセスを生成したいと思います。
Python 2.6のモジュールを使用しmultiprocessing
てプロセスを作成し、ウィンドウをで表示しようとしていますTKinter
。
このコードはWindowsでは問題なく機能しましたが、Linuxで実行するとTKinter
、を呼び出してもウィンドウが表示されません'showerror("MyApp Error", "Something bad happened.")'
。直接呼び出して同じプロセスで実行すると表示されますshowerrorprocess
。これを考えると、それTKinter
は適切に機能しているようです。コンソールに印刷したり、によって生成されたプロセスから他のことを実行したりmultiprocessing
できるので、それも機能しているようです。
彼らはただ一緒に働いていないようです。生成されたサブプロセスがウィンドウを作成できるようにするために、何か特別なことをする必要がありますか?
編集
問題はTKinter
、親プロセスによってインポートされ、子プロセスに「継承」されたようですが、どういうわけか、その状態は親プロセスと密接に関連しており、子プロセスでは機能しません。子プロセスを生成する前にインポートしないように注意する限りTKinter
、それは機能します。これは、子プロセスが初めてインポートするためです。
python - 分散pythonサーバーの効率的なレイアウト?
Python を複数のコンピューターの複数のプロセッサに分散させたい場合、どのような方法が最善でしょうか? 3 つの 8 コア サーバーがある場合、24 の Python プロセスを実行する必要があります。私はmultiprocessing ライブラリを使用しますが、オブジェクトを共有するには、マネージャーを使用するのが最善の方法のようです。すべてのノードを 1 つの大きなプロセスとして連携させたいので、1 つのマネージャーが理想的ですが、それではサーバーに単一障害点が生じます。より良い解決策はありますか?マネージャーのオブジェクト ストアを複製することは良い考えでしょうか?
また、管理者がすべてのデータベース クエリを実行する場合、データベースと同じマシンに管理者を配置することは理にかなっていますか?
python - Pythonでマルチプロセッシングを使用しているときにログに記録するにはどうすればよいですか?
現在、Python2.6multiprocessing
モジュールを使用して複数のプロセスを生成するフレームワークに中央モジュールがあります。を使用するためmultiprocessing
、モジュールレベルのマルチプロセッシング対応ログがありますLOG = multiprocessing.get_logger()
。ドキュメントによるとsys.stderr
、このロガーにはプロセス共有ロックがあり、複数のプロセスが同時に書き込みを行うことで、(またはファイルハンドルが)文字化けしないようになっています。
私が今抱えている問題は、フレームワークの他のモジュールがマルチプロセッシングに対応していないことです。私の見方では、この中央モジュールへのすべての依存関係でマルチプロセッシング対応のロギングを使用する必要があります。これは、フレームワークのすべてのクライアントにとっては言うまでもなく、フレームワーク内では厄介です。私が考えていない代替案はありますか?
python - multiprocessing:プロセス間で大きな読み取り専用オブジェクトを共有していますか?
マルチプロセッシングによって生成された子プロセスは、プログラムで以前に作成されたオブジェクトを共有しますか?
私は次の設定をしています:
大きなオブジェクトをメモリにロードし、その大きなオブジェクトを利用する必要があるワーカーのプールを作成しています。大きなオブジェクトは読み取り専用でアクセスされるため、プロセス間で変更を渡す必要はありません。
私の質問は、unix/c でプロセスを生成した場合のように、ビッグ オブジェクトが共有メモリにロードされるのか、それとも各プロセスがビッグ オブジェクトの独自のコピーをロードするのかということです。
更新: さらに明確にするために - big_lookup_object は共有ルックアップ オブジェクトです。それを分割して個別に処理する必要はありません。私はそれの単一のコピーを保持する必要があります。それを分割するために必要な作業は、他の多くの大きなファイルを読み取り、ルックアップ オブジェクトに対してそれらの大きなファイル内のアイテムを検索することです。
さらに更新: データベースは優れたソリューションです。この質問では、メモリ内ソリューションに特に興味がありました。最終的な解決策として Hadoop を使用しますが、ローカルのメモリ内バージョンも使用できるかどうかを確認したかったのです。
multithreading - マルチスレッドまたはマルチプロセッシング
堅牢でスケーラブルである必要がある Linux 専用の syslog 処理デーモンを設計しており、マルチスレッドとマルチプロセスについて議論しています。
マルチスレッドの明らかな反対は、複雑さと厄介なバグです。マルチプロセスは、IPC 通信とコンテキスト切り替えのためにパフォーマンスに影響を与える可能性があります。
「Unix プログラミングの芸術」では、これについてここで説明しています。
プロセスベースのシステム (Apache など) とマルチスレッドのアプローチのどちらをお勧めしますか?