これは一部の人にとっては単純すぎるとは申し訳ありませんが、私はまだPythonのマルチプロセッシングでそのトリックを得ていません。私は読んだ
http://docs.python.org/dev/library/multiprocessing
と他の多くのチュートリアルと例を私がGoogleに与えてくれた...それらの多くもここからです。並列処理のためのPythonマルチプロセッシング
私の状況は、多くのnumpy行列を計算する必要があり、後でそれらをnumpy行列に格納する必要があるということです。私は20コアを使用したいとします(または20コアを使用することができます)が、プールリソースが正常に使用されなかったとします。だから私はこのような何か行う上で考えた:
from multiprocessing import Process, Queue
import numpy as np
def f(q,i):
q.put(np.zeros((4,4)))
if __name__ == '__main__':
q = Queue()
for i in range(30):
p = Process(target=f, args=(q,))
p.start()
p.join()
result = q.get()
while q.empty() == False:
result += q.get()
print result
をしかし、それは並列で実行していないプロセスのように見えますが、彼らは順番に実行します(私が間違っている場合は、私を修正してください)、私はかどうかを知りません彼らは彼らの計算をした後に死ぬ(20以上のプロセスのために、彼らの部分をしたものはコアを別のプロセスのために自由にしておく)。さらに、非常に大きな数値(100.000としましょう)では、待ち行列にすべての行列(実際には大きすぎる可能性があります)を格納すると大量のメモリが使用され、各繰り返しごとにすべての結果を入れることになるため、最後の結果では、ロック(およびそのacquire()メソッドとrelease()メソッド)を使用するのと同じですが、このコードが並列処理用でない場合、ロックは役に立たない...
誰かが助けてくれることを願っています私。
ありがとうございます!
あなたの答えをありがとう!私は最初の解決策をもっと理解しており、imap_unorderedはすべての結果を保存しているようで、メモリを食べないようにしたいとは思いませんので、コールバックが非常に役立つことがわかります。プールについては、「x」プロセッサーを使用すると、「x」プロセッサーが最初のプロセスが終了しないため、「3x」プロセスが実行されることはわかりません(maxtasksperchild属性について読んでいるため)。私はまた、最初の "x"プロセスのために割り当てられたメモリがコールバックの後に空いているかどうかもわかりません。私は多くのより大きな行列を使用するときに私のPCを単にブロックしないように頼んでいます。 – Carlos
ああ!私は今それを得ると思います:プールは生きている限り労働者は生きていますが、1つのプロセスを終了するとリソースを解放し、次のプロセスを実行して計算を行います。 – Carlos
うん、そうだよ。あなたが実際にそれが問題であることを示すプロファイリングデータを持っていない限り、私は 'Pool'や代替物を心配する必要はありません。できる最適化はありますが、実際のシステムに問題があることをデモンストレーションするまでは、そのほとんどが問題にならないほどです。 –