タグ付けされた質問 「python-multiprocessing」

8
PythonマルチプロセッシングPicklingError:<type 'function'>をピクルできません
簡単な例ではエラーを再現できず、コードが複雑すぎて投稿できません。通常のPythonではなくIPythonシェルでプログラムを実行すると、うまくいきます。 この問題に関する以前のメモを調べました。それらはすべて、クラス関数内で定義された関数を呼び出すためにプールを使用することによって引き起こされました。しかし、これは私には当てはまりません。 Exception in thread Thread-3: Traceback (most recent call last): File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner self.run() File "/usr/lib64/python2.7/threading.py", line 505, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks put(task) PicklingError: Can't pickle &lt;type 'function'&gt;: attribute lookup __builtin__.function failed 何か助けていただければ幸いです。 更新:私が漬け込む機能は、モジュールのトップレベルで定義されています。ネストされた関数を含む関数を呼び出しますが。つまり、ネストされた関数を持つf()呼び出しをg()呼び出し、私はを呼び出しています。、、すべてのトップレベルで定義されています。私はこのパターンでより簡単な例を試しましたが、それはうまくいきます。h()i()pool.apply_async(f)f()g()h()

12
multiprocessing.Processに渡された関数の戻り値を回復するにはどうすればよいですか?
以下のコード例では、関数の戻り値を回復したいと思いますworker。これを行うにはどうすればよいですか?この値はどこに保存されますか? コード例: import multiprocessing def worker(procnum): '''worker function''' print str(procnum) + ' represent!' return procnum if __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker, args=(i,)) jobs.append(p) p.start() for proc in jobs: proc.join() print jobs 出力: 0 represent! 1 represent! 2 represent! 3 represent! 4 represent! …

1
multiprocessing.Pool:map_asyncとimapの違いは何ですか?
私は、Pythonの使用方法を学習しようとしているmultiprocessingパッケージを、私は違いを理解していないmap_asyncとimap。map_asyncとimapが非同期で実行されていることに気付きました。では、どちらをいつ使用すればよいですか?そして、どのようにして返された結果を取得する必要がありますmap_asyncか? このようなものを使用する必要がありますか? def test(): result = pool.map_async() pool.close() pool.join() return result.get() result=test() for i in result: print i


2
複数のプロセス間で結果キューを共有する
multiprocessingモジュールのドキュメントには、で始まるプロセスにキューを渡す方法が示されていますmultiprocessing.Process。しかし、どのようにして非同期ワーカープロセスでキューを共有できapply_asyncますか?動的な結合などは必要ありません。ワーカーが(繰り返し)結果をベースに報告する方法にすぎません。 import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) これは失敗します: RuntimeError: Queue objects should only be shared between processes through inheritance。私はこれが何を意味するのかを理解し、酸洗い/酸洗いを必要とするのではなく継承するためのアドバイス(およびWindowsのすべての特別な制限)を理解しています。しかし、機能するようにキューを渡すにはどうすればよいですか?私は例を見つけることができず、さまざまな方法で失敗した代替案をいくつか試しました。助けてください?

3
別のファイル/スクリプトをスレッド化または書き込むことなく、サブプロセスで関数を実行することは可能ですか?
import subprocess def my_function(x): return x + 100 output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments print output #desired output: 101 個別のスクリプトを使用してサブプロセスを開くことに関するドキュメントしか見つかりませんでした。関数オブジェクトを渡す方法や、関数コードを渡す簡単な方法を知っている人はいますか?

3
さまざまなPythonプロセスでDataFrameをリアルタイムで更新する
たとえば、キュ​​ーイングシステムから毎秒約500行(これをさらに並列化して約50 psに減らすことができます)でリアルタイムにデータを収集し、それを DataFrame。 rq = MyRedisQueue(..) df = pd.DataFrame() while 1: recv = rq.get(block=True) # some converting df.append(recv, ignore_index = True) ここで問題は、このデータに基づいてCPUをどのように利用するかです。したがって、私はGILの制限を完全に認識しており、ここでもマルチプロセッシングマネージャーの 名前空間を調べましたが、中央に保持されるデータフレームのレイテンシに関していくつかの欠点があるようです。それを掘り下げる前に、プロセス間に適用するために私が認識したものを試してみましたが、これは遅くなり、オーバーヘッドが多すぎます。pool.mappickle したがって、これが最後に疑問に思いました。1秒あたり500行(または1秒あたり50行)の挿入を別のプロセスに転送して、子のデータに統計とヒューリスティックを適用するためのCPU時間を残すにはどうすればよいでしょうか。プロセス? 多分それは2つのプロセスの間にカスタムTCPソケットまたはキューシステムを実装する方が良いでしょうか?または、親プロセス内の1つの大きなデータフレームへの高速アクセスを実際に許可するための実装pandasまたは他のライブラリーはありますか?パンダ大好き!

2
出力がしきい値を下回ったときに並列化されたforループが停止するような方法で遅延された並列を実装する方法は?
次のコードがあるとします。 from scipy import * import multiprocessing as mp num_cores = mp.cpu_count() from joblib import Parallel, delayed import matplotlib.pyplot as plt def func(x,y): return y/x def main(y, xmin,xmax, dx): x = arange(xmin,xmax,dx) output = Parallel(n_jobs=num_cores)(delayed(func)(i, y) for i in x) return x, asarray(output) def demo(): x,z = main(2.,1.,30.,.1) plt.plot(x,z, label='All …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.