問題タブ [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 - 異なるモジュールから同じ multiprocessing 名前空間にアクセスする方法
pySerial オブジェクトを含む共有オブジェクトを作成できる必要があります。このオブジェクトは、場所のリストからデバイスを見つけた後、子プロセスによって 1 回だけ作成されます。他のプロセスは後でそれを使用します。
Python マルチプロセッシング マネージャーは、他のオブジェクトに埋め込まれたオブジェクトへの変更を認識できません。したがって、マネージャーを作成すると:
プロセス間でオブジェクトを共有できます。
どこ
次に、子プロセスで実行します。
結果を出力します:
出力:
次のような単純なコードを使用できるようにしたい:
ns.obj.ser.write(), ns.obj.somemethod(arg) ここで
しかし、ns.obj.ser は、新しいプロセスから実行されると未定義と見なされるため、参照できません。conntrollers.py 内の他のメソッドで self.ser を参照し、それらを新しいプロセスで実行しようとすると、同じ状況になります。
編集:名前空間をモジュールにインポートする方法を見つけました:
または、オブジェクトの作成時にinitにns を送信します。しかし、問題はまだ存在します。ns.obj は、このオブジェクトがまだ作成中であるため、NoneType オブジェクトです。したがって、ns.obj.ser= self.ser と入力できません ns を SerialReader() に送信しようとすると
SerialReader_ init _内に印刷しようとすると、次のようになります。
私もそれにserを追加することはできません..
python - Pythonのマルチプロセッシングの共有変数
最初の質問は、Value と Manager().Value の違いは何ですか?
第二に、値を使用せずに整数変数を共有することは可能ですか? 以下は私のサンプルコードです。私が欲しいのは、値ではなく整数の値を持つ辞書を取得することです。私がしたことは、プロセスの後にすべてを変更することです。もっと簡単な方法はありますか?
python - マルチプロセッシングを理解する: Python での共有メモリ管理、ロック、およびキュー
マルチプロセッシングは python の強力なツールであり、もっと深く理解したいと思っています。通常の ロックとキューを使用するタイミングと、マルチプロセッシングマネージャーを使用してこれらをすべてのプロセス間で共有するタイミングを知りたいです。
マルチプロセッシングの 4 つの異なる条件を使用して、次のテスト シナリオを考え出しました。
プールとNO Managerの使用
プールとマネージャーの使用
個々のプロセスとNO Managerの使用
個々のプロセスとマネージャーの使用
仕事
すべての条件がジョブ機能を実行しますthe_job
。the_job
ロックによって保護されたいくつかの印刷で構成されています。さらに、関数への入力は単純にキューに入れられます (キューから復元できるかどうかを確認するため)。この入力は、(一番下に表示されている)と呼ばれるメイン スクリプトで作成された単純なインデックスidx
です。range(10)
start_scenario
条件の成功は、キューからの入力を完全にリコールすることとして定義されますread_queue
。下部の関数を参照してください。
状況、契約条項
条件 1 と 2 は、かなり自明です。条件 1 では、ロックとキューを作成し、これらをプロセス プールに渡します。
(ヘルパー関数make_iterator
は、この投稿の下部に記載されています。) 条件 1 は で失敗しRuntimeError: Lock objects should only be shared between processes through inheritance
ます。
条件 2 はかなり似ていますが、ロックとキューはマネージャの監視下にあります。
条件 3 では、新しいプロセスが手動で開始され、マネージャーなしでロックとキューが作成されます。
条件 4 は似ていますが、ここでもマネージャーを使用しています。
3 と 4 の両方の条件で、10 個のタスクのそれぞれに対して新しいプロセスを開始the_job
し、最大でncoresプロセスが同時に動作します。これは、次のヘルパー関数で実現されます。
結果
条件 1 のみが失敗し ( RuntimeError: Lock objects should only be shared between processes through inheritance
)、他の 3 つの条件は成功します。私はこの結果に頭を悩ませようとします。
プールはすべてのプロセス間でロックとキューを共有する必要があるのに、条件 3 の個々のプロセスは共有しないのはなぜですか?
私が知っているのは、プール条件 (1 と 2) では、イテレーターからのすべてのデータが酸洗を介して渡されるのに対し、単一プロセス条件 (3 と 4) では、イテレーターからのすべてのデータがメイン プロセスからの継承によって渡されることです (私はLinuxを使用)。子プロセス内からメモリが変更されるまで、親プロセスが使用するのと同じメモリがアクセスされると思います(コピーオンライト)。しかしlock.acquire()
、これは変更する必要があり、子プロセスはメモリ内の別の場所に配置された別のロックを使用しますよね? 1 つの子プロセスは、マネージャーを介して共有されていない兄弟がロックをアクティブにしたことをどのように知るのでしょうか?
最後に、条件 3 と 4 がどれだけ異なるかという私の質問に多少関連があります。どちらも個別のプロセスを持っていますが、マネージャーの使用法が異なります。どちらも有効なコードと見なされますか? それとも、実際にマネージャーが必要ない場合は、マネージャーの使用を避けるべきですか?
完全なスクリプト
すべてをコピーして貼り付けてコードを実行したい人のために、完全なスクリプトを次に示します。
python - Python でのマルチスレッド システム コール
私はそのようなものであるPythonスクリプトを持っています:
os.system
異なるプロセッサで各呼び出しを呼び出す最良の方法は何ですか? サブプロセスまたはマルチプロセッシングプールを使用していますか?
注 : プログラムを実行するたびに、出力ファイルが生成されます。
python - ディクショナリの各キーに対する Python マルチプロセッシング
私はPythonが初めてで、処理を並行してスケーリングしようとしています。特定の数のタプルを含むファイルがあり、それぞれの最後の列に特定の値があります。このファイル データを分割し、関数を各チャンクに並列に適用したいと考えています。しかし、問題は、最後の列の値に基づいてデータをチャンクに分割し、各チャンクに関数を適用することです。たとえば、最後の列には、一部のタプルには「a」、一部には「b」、一部には「c」が含まれる場合があります。その場合、3 つのチャンクを取得して並列処理する必要があります。最後の列の一意の値の数はデータセットによって変わる可能性があるため、それに応じて CPU を使用する必要があります。
Q1: 私が今まで試みたのは、ファイルを読み取り、そのレコードに基づいて辞書を作成することでした。したがって、基本的に、上記のキーと値のペアが 3 つ、1 つはキーとして 'a' を持ち、すべてのレコードは値として 'a' を持ち、 'b' と 'c' も同様です。マルチプロセッシングでチャンクサイズを利用できますが、ここではサイズではなく、キーに基づいているため、どうすればこれを達成できますか?
Q2: 上記のチャンクを処理した後、すべてをまとめて出力する必要があります。順序は関係ありません。出力全体を使用してさらに処理する必要があります。これらすべてのプロセスが完了するまでメイン プログラムを待機させるにはどうすればよいですか?
さらに入力が必要な場合はお知らせください。ありがとう。
python - Python マルチプロセッシング - プロセス数
私は以下のコードを実行しており、正常に動作していますが、別のプロセスに生成されていません. そして、私は4つのCPUマシンを使用しています。このコードの何が問題になっていますか?
そして結果は
また、時にはこんな風に、
時々、
そして私の質問は、どのような基準で機能をワーカーに割り当てるのですか? ディクショナリ内のキーの数に基づいてプロセスの数を決定する方法でコードを記述しています (データのキーは常に CPU よりも少ないことを考慮して)。私のコードは次のように始まります-メインコードはファイルを読み取り、単一のプロセスを使用して辞書を作成し、それを複数の同時プロセスに分岐し、それらがデータを処理するのを待つ必要があります(私はそのためにpool.mapを使用しています)、次に子プロセスの結果を取得すると、それらの処理を開始します。この親が子プロセスステップを待機するようにするにはどうすればよいですか?