問題タブ [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.
linux - シェル スクリプトの実行を同期する
シェル スクリプトの修正版は、オーディオ ファイルを FLAC から MP3 形式に変換します。コンピューターにはクアッドコア CPU が搭載されています。スクリプトは次を使用して実行されます。
これにより、ディレクトリ内の FLAC ファイル(ファイル名にスペースなし) がディレクトリ内 ( と同じレベル)flac
の MP3 ファイルに変換されます。コピー先の MP3 ファイルが既に存在する場合、スクリプトはそのファイルをスキップします。mp3
flac
問題は、スクリプトの 2 つのインスタンスが同じ MP3 ファイルの存在をほぼ同時にチェックすることがあり、その結果、MP3 ファイルが壊れることがあります。
コマンドラインごとに異なるファイルセットを指定したり、作業を上書きしたりせずに、スクリプトを複数回 (つまり、コアごとに 1 回) 実行するにはどうすればよいでしょうか?
更新 - 最小限の競合状態
このスクリプトは、次のロック メカニズムを使用します。
ただし、これでも競合状態が残ります。
visual-studio-2005 - 並列ビルド用の pdb ファイルを生成するには?
Visual Studio 2005を使用して複数の devenv.com を実行する場合のリンク/pdb 生成に関する問題を解決するためのアイデアを募集しています。
devenv.com を使用して並列ビルドを実行すると、断続的に次のエラーが発生します。つまり、同じビルド サーバーで次のものが同時に実行される場合:
pdbファイルが必要なので、それらをオフにすることは実際にはオプションではありません。ビルドを連続して実行しても問題は発生しませんが、もちろんビルド プロセスが遅くなります。
これまでに見つかった参照は、
- 256 ファイル パスの制限を超えるファイル名の長さに問題があることを確認しましたが、個別にビルドできるため、これは私たちの問題ではないようで、パス + ファイル名の長さは約 160 文字です。
- インクリメンタル ビルドに問題があり (主に Visual Studio 2008 で)、インクリメンタル リンクがオフになっています。
可能であれば、この複数プロセスの問題を解決するための情報を求めています。
どうすれば解決できますか?
python - python マルチプロセッシング プロキシ
私は2つのプロセスを持っています:
最初のプロセスは、バックグラウンドでmanager.py が開始されます。
2 つ目は、マネージャーに定義された登録済みオブジェクトを使用するはずのconsumer.pyです。
マネージャーをバックグラウンドで実行すると、コンシューマーよりもエラー メッセージが表示されます: RuntimeError: maximum recursion depth exceeded , when using addChild into the consumer , while I can successfully use setName .
メソッドaddChildおよびsetNameはCompositeDictに属し、プロキシされていると思われます。
どうしたの?
CompositeDictはネイティブの__getattr__ __ メソッドを上書きし、エラー メッセージに関与しています。何らかの方法で、正しい__getattr__メソッドが使用されていないと思います。もしそうなら、どうすればこの問題を解決できますか??
詳細なエラー メッセージは次のとおりです。
python - multiprocessing.Process のログ出力
Python で multiprocessing.Process クラスを使用しているときに、特定のプロセスから stdout 出力をログに記録する方法はありますか?
python - pyodbc を使用した Python のマルチプロセッシングとデータベース アクセスは「安全ではありません」?
問題:
次のトレースバックが表示されますが、その意味や修正方法がわかりません。
状況:
処理するデータでいっぱいの SQL Server データベースがあります。multiprocessing モジュールを使用して作業を並列化し、コンピューターの複数のコアを利用しようとしています。私の一般的なクラス構造は次のとおりです。
- MyManagerClass
- これは、プログラムが開始されるメイン クラスです。
- 2 つの multiprocessing.Queue オブジェクトを 1 つと 1 つ作成します
work_queue
。write_queue
- また、他のプロセスを作成して起動し、それらが終了するのを待ちます。
- 注: これはmultiprocessing.managers.BaseManager() の拡張ではありません
- MyReaderClass
- このクラスは、SQL Server データベースからデータを読み取ります。
- にアイテムを入れます
work_queue
。
- MyWorkerClass
- ここで作業処理が行われます。
- からアイテムを取得し、
work_queue
完成したアイテムを に入れwrite_queue
ます。
- MyWriterClass
- このクラスは、処理されたデータを SQL Server データベースに書き戻す役割を担います。
- からアイテムを取得します
write_queue
。
アイデアは、1 人のマネージャ、1 人のリーダー、1 人のライター、および多数のワーカーが存在するというものです。
その他の詳細:
私は stderr で 2 回トレースバックを取得するので、リーダーに対して 1 回、ライターに対して 1 回発生すると考えています。ワーカー プロセスは正常に作成されますが、KeyboardInterrupt を送信するまでそのまま待機しwork_queue
ます。
リーダーとライターの両方が、初期化時に作成されたデータベースへの独自の接続を持っています。
解決:
このソリューションにつながった回答と質問について、Mark と Ferdinand Beyer に感謝します。彼らは、Cursor オブジェクトが "pickle-able" ではないことを正しく指摘しました。これは、マルチプロセッシングがプロセス間で情報を渡すために使用する方法です。
私のコードの問題は、MyReaderClass(multiprocessing.Process)
両方がメソッドMyWriterClass(multiprocessing.Process)
でデータベースに接続されていることでした。__init__()
これらの両方のオブジェクトを で作成し (つまり、init メソッドと呼びます) MyManagerClass
、次に を呼び出しstart()
ました。
したがって、接続オブジェクトとカーソル オブジェクトを作成し、それらを pickle 経由で子プロセスに送信しようとします。私の解決策は、接続オブジェクトとカーソル オブジェクトのインスタンス化を、子プロセスが完全に作成されるまで呼び出されない run() メソッドに移動することでした。
python - multiprocessing.Queue をリストにダンプする
multiprocessing.Queue
a をリストにダンプしたい。そのタスクのために、次の関数を作成しました。
しかし、何らかの理由で機能しません。
次のシェル セッションを確認します。
ここで何が起こっているのですか?すべてのアイテムがダンプされていないのはなぜですか?
python - Python マルチプロセッシングの文字列引数
プロセス内のターゲット関数に文字列引数を渡そうとしています。どういうわけか、文字列は文字と同じ数の引数のリストとして解釈されます。
これはコードです:
私はこの出力を得る:
私は何を間違っていますか?stringn を渡すにはどうすればよいですか?
ありがとう、アリエル
python - Python マルチプロセッシング: 使用するコア数を制限する
L > M の場合、L 個のコアを持つマシンで N 個の独立したタスクを正確に M 個のプロセッサに分散する方法を知りたいです。I/O を利用できるようにしたいので、すべてのプロセッサを使用したくありません。私が試した解決策は、すべてのプロセッサに分散され、システムが動かなくなったようです。
マルチプロセッシング モジュールが最適だと思います。
数値シミュレーションをしています。私のバックグラウンドはコンピュータ サイエンスではなく物理学なので、残念ながら、サーバー/クライアント、プロデューサー/コンシューマーなどの標準的なタスク モデルに関する議論を完全には理解していないことがよくあります。
私が試したいくつかの単純化されたモデルを次に示します。
シミュレーションを実行する関数run_sim(**kwargs)
(以下を参照) と、シミュレーション用の kwargs の長いリストがあり、8 コアのマシンがあるとします。
プロセッサの使用率を「top」、「1」の順で見ると、どちらの場合でもすべてのプロセッサが使用されているようです。「top」の出力を誤解しているのは論外ではありませんが、run_simulation()
プロセッサを集中的に使用する場合、マシンはひどく動かなくなります。
仮説シミュレーションとデータ:
python - マルチプロセッサマシン上のPython:マルチプロセッシングまたは非GILインタプリタ
これはもっとスタイルの質問です。複数のコアを持つことで本当にメリットがあるCPUバウンドプロセスの場合、通常、マルチプロセッシングモジュールを使用しますか、それともGILを持たないインタープリターでスレッドを使用しますか?私はマルチプロセッシングライブラリをほんの少ししか使用していませんが、CPython以外の経験もありません。私は、好ましいアプローチが何であるか、そしてそれが別のインタープリターを使用することであるかどうかに興味があります。
python - ワーカーのマルチプロセッシング プールの使用
遅延した 2 番目の CPU コアを機能させるために、次のコードを記述しました。コードが基本的に行うことは、最初にディレクトリ階層で目的の「sea」ファイルを見つけ、後で外部スクリプトのセットを実行してこれらのバイナリ「sea」ファイルを処理し、50 から 100 個のテキスト ファイルとバイナリ ファイルを生成することです。質問のタイトルが示すように、処理速度を向上させるために並行して実行します。
この質問は、「 ipcluster を起動できません」というタイトルの IPython ユーザー リストでの長い議論に由来しています。IPython の並列処理機能に関する私の実験から始めます。
問題は、このコードを正しく実行できないことです。「sea」ファイルを含むフォルダに「sea」ファイルのみが格納されている場合、スクリプトは外部スクリプトの実行を完全に実行せずに実行を終了します。(実行する外部スクリプトが 30 ~ 50 あるとしますが、マルチプロセッシングが有効なスクリプトは、これらの外部スクリプト チェーンの最初のスクリプトを実行した後にのみ枯渇します。) 興味深いことに、このスクリプトを既に処理されたフォルダー ("sea" ファイル) で実行すると、事前に処理されており、出力ファイルがそのフォルダーに既にある)、実行すると実行されますが、今回はリニアな処理タイミングに対して約 2.4 倍から 2.7 倍の高速化が得られます。私のラップトップには Core 2 Duo 2.5 Ghz CPU しかないので、あまり期待できません。私はCUDAを搭載したGPUを持っていますが、それは私の現在の並列計算の苦労とは何の関係もありません:)
この問題の原因は何だと思いますか?
すべてのコメントと提案に感謝します。