問題タブ [python-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.
python - Python のプロセス間で postgres db への接続を共有する
デーモンとして実行されている Python スクリプトがあります。起動時に 5 つのプロセスが生成され、それぞれが Postgres データベースに接続します。現在、DB 接続の数 (最終的には非常に大きくなります) を減らすために、単一の接続を複数のプロセスで共有する方法を見つけようとしています。そして、この目的のために私はmultiprocessing.sharedctypes.Value
APIを見ています。psycopg2.connection
ただし、この API を使用してプロセス間でオブジェクトを渡す方法がわかりません。誰がそれがどのように行われるのか教えてもらえますか?
この問題を解決するために、私は他のアイデアにもオープンです。
接続をコンストラクタの一部として 5 つのプロセスに渡すことを考慮しなかった理由は、相互排除の処理です。このアプローチに従った場合、複数のプロセスが接続にアクセスするのを防ぐ方法がわかりません。これが正しいことかどうか誰かに教えてもらえますか?
python - Python を使用した Popen、マルチプロセッシング、およびデーモン
Popenで長いfoobar.pyプロセスを実行し、その出力をマルチプロセッシングプロセスで解析する必要があります。
私の問題は、パーサーが終了するのを待てないことがあるため、 multiprocessing デーモン プロパティを使用してパーサーをデーモン化する必要があることです。パーサーがデーモン的ではないデーモン的な方法の両方で使用できるようにする必要があります。ドキュメントには、デーモンプロセスが子プロセスを作成することは許可されていないとも書かれています。その場合、パーサーが fork される前に Popen プロセスを実行します (以下の start メソッドを参照)。
ここで、foobar.pyが数秒待って何かを出力し、 parseFoobarメソッドが出力をファイルに出力するとします。私の場合、両方の関数はこれよりもはるかに複雑です。
実行は正常に機能し、 sync.txtParser(daemon=False, "sync.txt").start()
にいくつかの出力があります。しかし、実行してもasync.txtには何も生成されず、ファイルが作成されているため、行でブロックされているように見えますが、空です。Parser(daemon=True, "async.txt")
for line in iter(self.process.stdout):
うまくいかないのはなぜですか?どうすれば修正できますか?
テスト用にparser.pyとfoobar.pyの要点を見つけることができます。実行python parser.py
して出力ファイルを確認するだけです。
編集: djangoデーモン化メソッドにはいくつかのヒントがあります
python - Python のマルチプロセッシング テキスト抽出のパフォーマンスの問題と Perl の同等物
これを回答済みとしてマークし、速度の問題が実際に発生していると思われる場所に関するより簡単なトピックを開始しました
これまでのすべてのコメントに感謝します。非常に便利です
約 4,000 万個の XML ファイルが (均等ではなく) 約 2 か所に分散しています。60K のサブディレクトリ。構造は 10 桁の番号分割に基づいているため、次のようになります。
12/34/56/78/90/files.xml
単一のフィールドの値を引き出して値とファイル名を出力するファイルに対して実行する perl スクリプトがあります。Perl スクリプトは、深さ 2 のすべてのディレクトリのリスト全体で最大 12 の並列インスタンスを実行する bash スクリプトにラップされ、次に各ディレクトリをたどって最下層でファイルを見つけたら処理します。
複数の実行からディスク キャッシュを取得すると、プロセスの unix 時間が返されます。
これを (学習演習とテストとして) Python スクリプトに移行したかったので、次のように作成しました (さまざまなことについて Python メソッドを何度も読んだ後)。
しかし、UNIX 時間を実行するときにコンテンツをどのようにスライスしても、次のような結果が得られます。
小さなサブセットに対して単一のスレッドで python と perl スクリプトの両方を実行すると (最終的には完全にキャッシュされます)、ディスク io がありません (iotop によると) と、スクリプトはほぼ同じ時間で実行されます。
これまでに考えられる唯一の結論は、ファイル io が問題を引き起こしているように見えるため、perl スクリプトよりも python スクリプトの方がはるかに効率が悪いということです。
うまくいけば、それで十分な背景があります。私の質問は、アイデアが不足しているため、愚かなことをしているのか、トリックを見逃しているのかということですが、ioが処理時間にそのような違いを引き起こしているとは信じられません。
ポインタを高く評価し、必要に応じて詳細情報を提供します。
ありがとう
シ
参考までに、Perl スクリプトは以下のとおりです。
python - インスタンス メソッドで実行されている子プロセスに multiprocessing.Queue インスタンス変数を明示的に渡す必要がありますか?
multiprocessing
Python のモジュールの使用に関して、基本的な質問がいくつかあります。
渡す必要がありwork_queue
ますresult_queue
か?答えはOSに依存しますか?より基本的な質問は、子プロセスは親プロセスからコピーされた (COW) アドレス空間を取得するので、クラス/クラス メソッドの定義を知っているかどうかです。はいの場合、キューが IPC 用に共有されること、および子プロセスでandの複製を作成してはならないことをどのように認識しますか? これをオンラインで検索してみましたが、見つかったドキュメントのほとんどはあいまいで、実際に何が起こっているのかについて十分に詳しく説明していませんでした。 args
Process
work_queue
result_queue
python - Pythonで他のコマンドが終了する前にコマンドを実行する
私はすでに尋ねましたが、良いアドバイスをくれる人はほとんどいませんでしたが、初心者の私には不明な点がたくさんありました. したがって、悪いコードを提供せずに、もう一度助けを求めることにしました。
他のファイルがまだ実行されている間に、ディレクトリへのファイルのコピーを実行するスクリプトが必要です。基本的に、最初のコマンドを実行すると、ファイルが生成され(ユーザーがEnterキーを押すまで)、それらのファイルはなくなります(自動的に削除されます)。
私がしたいのは、それらのファイルをコピーすることです(「Enter」を押す必要もありません)。私はbashで作成しましたが、Pythonでこれを実現したいと考えています。下記を参照してください:
python - クラスのメソッドで multiprocessing.Pool を使用できますか?
multiprocessing
パフォーマンスを向上させるために、コードで使用しようとしています。
ただし、次のようなエラーが発生しました。
別の方法で試してみたところ、次のエラーが発生しました。
私のコードは次のようになります。
Pool
main 関数でを使用していないため、エラーが発生していると思います。
私の推測は正しいですか?また、コードを変更してエラーを修正するにはどうすればよいですか?
python - multiprocessing.Pool のプロセスが実行時エラーを報告しない
を使用してPythonでプロセスのプールを持っていますfrom multiprocessing import Pool
。これらのプロセスに、実行するさまざまな関数を渡し、Pool.apply_async
関数を呼び出します。これらの関数の 1 つ (例: のようなコード行5/0
) にエラーを導入すると、予想されるコマンド ライン レポートZeroDivisionError: integer division or modulo by zero
が表示されず、プログラムが終了しません。への呼び出しにコールバック関数を導入してPool.apply_async
も、プロセスが実行する必要がある関数にエラーがある場合、コールバック関数は呼び出されません。
プール内のこれらのプロセスでエラーを報告し、問題が発生した場合に終了するにはどうすればよいですか?
python - Python マルチプロセッシング: プロセス全体で一意のオブジェクト識別子
各プロセスが特定のクラスの新しいインスタンスのリストを作成する場合、いくつかのプロセスを並行して実行したいとします (マルチプロセッシングを使用し、クラスター内のように複数の別々のマシンで実行することもできます)。次に、これらすべてのリストを親プロセスに送り返し、それらを結合します。さて、これらのインスタンスをオブジェクト ID でインデックス化できますか? 各オブジェクトが別のプロセス (場合によっては別のマシン) で生成された場合、ID がオブジェクトを一意に識別することを期待できますか?
言い換えれば、オブジェクトの ID は、プロセス間でデータを送信するために必要な pickle 化後も存続しますか? それとも、オブジェクトを unpickle するときに、インタープリターがオブジェクトに新しい一意の ID を割り当てますか?