問題タブ [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マルチプロセッシングPicklingError:ピクルできません
簡単な例でエラーを再現できないこと、およびコードが複雑すぎて投稿できないことをお詫び申し上げます。通常の Python ではなく IPython シェルでプログラムを実行すると、うまくいきます。
この問題に関する以前のメモを調べました。それらはすべて、プールを使用してクラス関数内で定義された関数を呼び出すことが原因でした。しかし、これは私には当てはまりません。
助けていただければ幸いです。
更新:私がピクルする関数は、モジュールのトップレベルで定義されています。ネストされた関数を含む関数を呼び出しますが。つまり、ネストされた関数を持つf()
呼び出しをg()
呼び出し、私は呼び出しています。、、はすべてトップレベルで定義されています。このパターンでより簡単な例を試してみましたが、うまくいきます。h()
i()
pool.apply_async(f)
f()
g()
h()
python - Python プールの apply_async と map_async はフルキューでブロックされません
私はPythonにかなり慣れていません。標準入力でテキスト行を読み取り、何らかの方法で変換してデータベースに書き込むために multiprocessing モジュールを使用しています。これが私のコードのスニペットです:
Pythonプログラムにパイプする巨大な入力ファイル(数億行)を処理するまで、すべて正常に動作します。ある時点で、データベースが遅くなると、メモリがいっぱいになります。
いくつか遊んだ後、pool.apply_async と pool.map_async が決してブロックされないことが判明したため、処理される呼び出しのキューがますます大きくなります。
私の問題に対する正しいアプローチは何ですか? 特定のキューの長さに達するとすぐに、pool.apply_async 呼び出しをブロックする、設定できるパラメーターが必要です。AFAIR Java では、その目的のために ThreadPoolExecutor に固定長の BlockingQueue を与えることができます。
ありがとう!
python - 複数のプロセス間で結果キューを共有する
モジュールのドキュメントには、 でmultiprocessing
開始されたプロセスにキューを渡す方法が示されていますmultiprocessing.Process
。しかし、で開始された非同期ワーカー プロセスとキューを共有するにはどうすればよいapply_async
でしょうか。動的結合などは必要ありません。ワーカーが結果を (繰り返し) ベースに報告する方法だけです。
これは失敗します:
RuntimeError: Queue objects should only be shared between processes through inheritance
. 私はこれが何を意味するかを理解しています。また、ピクル/アンピクル (およびすべての特別な Windows の制限) を要求するのではなく、継承するというアドバイスも理解しています。しかし、機能する方法でキューを渡すにはどうすればよいでしょうか? 例が見つかりません。さまざまな方法で失敗したいくつかの代替案を試しました。助けてください?
python - multiprocessing.Processに渡された関数の戻り値を回復するにはどうすればよいですか?
以下のサンプルコードでは、関数の戻り値を復元したいと思いますworker
。どうすればこれを行うことができますか?この値はどこに保存されますか?
サンプルコード:
出力:
に格納されているオブジェクトに関連する属性が見つからないようですjobs
。
python - python マルチプロセッシング、マネージャーはプロセス生成ループを開始します
仕事の出力を Manager リストに追加しようとするワーカーのプールをセットアップする単純な python マルチプロセッシング スクリプトがあります。このスクリプトには 3 つのコール スタックがあります。スクリプトをデバッグしようとすると (偶然にも Windows 7/64 ビット/VS 2010/PyTools で)、スクリプトはネストされたプロセス作成ループに突入し、無数のプロセスが生成されます。誰でも理由を特定できますか?私は非常に単純なものが欠けていると確信しています。問題のあるコードは次のとおりです: -
PS: multiprocessing.freeze_support()
main に追加しようとしましたが、役に立ちませんでした。
python - プールワーカーはすべてのタスクを完了しません
dataframe
カスタムマネージャーを介してパンダに出力を追加するワーカーのプールを設定する、比較的単純なpythonマルチプロセッシングスクリプトがあります。私が見つけたのは、プールでclose()/ join()を呼び出したときに、apply_asyncによって送信されたすべてのタスクが完了しているわけではないということです。
これは、1000個のジョブを送信するが、半分しか完了していないためにアサーションエラーが発生する単純化された例です。非常に単純なものを見落としたことがありますか、それともこれはおそらくバグですか?
python - Pythonマルチプロセッシング:管理された辞書キーを削除するには?
によって管理されているディクショナリがあり、関数と関数をSyncManager
使用して、ディクショナリのキーと値を取得および設定しています。ただし、メソッドは実装されていません。管理された辞書キーからキーを削除する方法はありますか?.get()
.update()
del dict[key]
簡単な例:
python - python multiprocessing.Process.Manager は一貫した結果を生成しませんか?
私が見ている問題を説明するために、次のコードを書きました。Process.Manager.list()
リストを追跡し、そのリストのランダムなインデックスをインクリメントするためにa を使用しようとしています。
100 個のプロセスが生成されるたびに、各プロセスはリストのランダム インデックスを 1 ずつ増やします。したがって、結果のリストの SUM は毎回同じであると予想されますよね? 203 から 205 の間の何かを取得します。
python - multiprocessing.managerの問題sys.args
マルチプロセスされた小さなWindowsサービスアプリケーション内で次のPythonコード行を実行しています。
問題は、Windowsサービスの実行時にモジュールsysセット内に属性argvがないように見えることです。この結果、Pythonマルチプロセッシングフォークライブラリ内で次のエラーが発生します。私は誰かがこの問題に光を当てることができるかもしれないことを望んでいました。
問題のスタックトレース(Windowsサービス内でmultiprocessing.Managerを実行している場合):
アップデート
sys.argv
私の問題に対する1つの可能な解決策は、実行時に設定されていない場合は手動で値を設定することですが、これは非常に非Python的です。しかし、それが唯一の解決策かもしれません。stackoverflow-ersはどう思いますか?
しかし、これにより、multiprocessing.managerの新しい問題が発生し、コード内で予期しないEOFErrorが発生します。
python - Python:2つのプロセスAとBが与えられた場合、BからAの関数を呼び出します
に基づく:http ://docs.python.org/2/library/multiprocessing.html#managers私は、クライアントとサーバーの2つのプロセスに分割されるように例の1つを書き直しています。次のコードです。
このコードは機能し、クライアントからサーバーからクラスMathsClass内の関数を呼び出すことができます。
私が抱えている問題は、他の場所からのデータを処理しない、MathsClassで直接定義された関数に制限されていることです。
たとえば、ManagerServerで「addOuter(self、x、y)」という関数を定義し、クラスMathsClass内で、その関数addでaddOuter()を呼び出すと、それを見ることができず、存在しないと表示されます。 。
したがって、私の質問は、AとBの2つのプロセスがあり、Aが別のクラス内ではなくinitと同じレベルで定義された関数を持っている場合、BからAでこれらの関数を呼び出すにはどうすればよいですか?