(1)_pool.map
_に続いてpool.join()
を使用しようとしていますが、pythonは_pool.map
_が終了するのを待っていないようですpool.join()
を通過する前に、私が試したことの簡単な例を示します。
_from multiprocessing import Pool
foo = {1: []}
def f(x):
foo[1].append(x)
print foo
def main():
pool = Pool()
pool.map(f, range(100))
pool.close()
pool.join()
print foo
if __name__ == '__main__':
main()
_
pythonはjoin
コマンドを無視し、f
を実行する前に_{1: []}
_を実行したかのように、印刷出力は_print foo
_です。意図した結果はfoo
です。が_{1:[0,1,...,99]}
_であり、通常の組み込みpython map
を使用すると、この結果が得られます。プールされたバージョンが_{1: []}
_を印刷するのはなぜですか。意図した結果を印刷しますか?
(2)理想的には、main()
でfoo
をローカル変数として定義し、f
に渡しますが、foo
をf
の最初の引数にして、
pool.map(functools.partial(f, foo), range(100))
同じ出力を生成します。 (そして、おそらく各プロセスがfoo
の独自のコピーを持っているという問題もあります?)繰り返しますが、代わりに通常のmap
を使用して動作します。
これはmap
を使用する正しい方法ではありません。
f
にはfoo
の独自のコピーがあります。異なるプロセス間で変数を共有するには、Manager
を使用する必要がありますmap
に渡される関数は、通常、値を返すことが期待されています。ドキュメント を読むことをお勧めします。
ただし、これを実装する方法のダミーの例を次に示します。
_from multiprocessing import Pool
foo = {1: []}
def f(x):
return x
def main():
pool = Pool()
foo[1] = pool.map(f, range(100))
pool.close()
pool.join()
print foo
if __name__ == '__main__':
main()
_
また、foo
がManager
であるpool.map(functools.partial(f, foo), range(100))
のようなこともできます。