pan*_*via 19 python multiprocessing python-2.7
(1)我试图使用pool.map之后pool.join(),但蟒蛇似乎并没有在等待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()
Run Code Online (Sandbox Code Playgroud)
打印输出就好了{1: []},好像python只是忽略了join命令并print foo在它有机会运行之前运行f.预期的结果是,foo是{1:[0,1,...,99]},使用普通的内置Python map给出了这样的结果.为什么合并版本打印{1: []},如何更改我的代码以使其打印预期结果?
(2)理想情况下,我也想定义foo为局部变量main()并将其传递给f,但是通过制作foo第一个参数f和使用它来做到这一点
pool.map(functools.partial(f, foo), range(100))
产生相同的输出.(并且可能还有一个问题,即每个进程现在都有自己的副本foo?)尽管如此,它仍然可以使用普通代码map.
sme*_*eso 26
这不是正确的使用方法map.
f都有自己的副本foo.要在不同进程之间共享变量,您应该使用aManagermap通常会返回一个值.我建议你阅读一些文档.
但是,这是一个如何实现它的虚拟示例:
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()
Run Code Online (Sandbox Code Playgroud)
你也可以这样做pool.map(functools.partial(f, foo), range(100)),其中foo一个Manager.