multiprocessing の使用方法を学習しようとしていますが、 次の例 が見つかりました。
次のように値を合計します。
from multiprocessing import Pool
from time import time
N = 10
K = 50
w = 0
def CostlyFunction(z):
r = 0
for k in xrange(1, K+2):
r += z ** (1 / k**1.5)
print r
w += r
return r
currtime = time()
po = Pool()
for i in xrange(N):
po.apply_async(CostlyFunction,(i,))
po.close()
po.join()
print w
print '2: parallel: time elapsed:', time() - currtime
すべてのr値の合計を取得できません。
そのようなapply_asyncを使用する場合は、何らかの共有メモリを使用する必要があります。また、マルチプロセスを開始する部分を配置して、プールされたプロセスではなく、初期スクリプトによって呼び出されたときにのみ実行されるようにする必要があります。地図でそれを行う方法を次に示します。
from multiprocessing import Pool
from time import time
K = 50
def CostlyFunction((z,)):
r = 0
for k in xrange(1, K+2):
r += z ** (1 / k**1.5)
return r
if __name__ == "__main__":
currtime = time()
N = 10
po = Pool()
res = po.map_async(CostlyFunction,((i,) for i in xrange(N)))
w = sum(res.get())
print w
print '2: parallel: time elapsed:', time() - currtime
pythonのサンプルドキュメント で見つけた最も単純な例を次に示します。
_from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=4) # start 4 worker processes
result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously
print result.get(timeout=1) # prints "100" unless your computer is *very* slow
print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]"
_
私も理解できたので、とても簡単でした。
注result.get()
は計算をトリガーするものです。