这个(非常简化的例子)工作正常(Python 2.6.6,Debian Squeeze):
from multiprocessing import Pool
import numpy as np
src=None
def process(row):
return np.sum(src[row])
def main():
global src
src=np.ones((100,100))
pool=Pool(processes=16)
rows=pool.map(process,range(100))
print rows
if __name__ == "__main__":
main()
然而,经过多年的教学 全球状态不好!!! ,我所有的直觉告诉我,我真的更愿意写更接近的东西:
from multiprocessing import Pool
import numpy as np
def main():
src=np.ones((100,100))
def process(row):
return np.sum(src[row])
pool=Pool(processes=16)
rows=pool.map(process,range(100))
print rows
if __name__ == "__main__":
main()
但当然不起作用(挂断无法腌制的东西)。
这里的例子很简单,但是当你添加多个“进程”函数时,每个函数都依赖于多个额外的输入......这一切都让人想起30年前用BASIC编写的东西。尝试使用类来至少使用适当的函数聚合状态似乎是一个明显的解决方案,但实际上是doesn't seem to be that easy。
是否有一些推荐的模式或样式用于使用multiprocessing.pool,这将避免全局状态的扩散,以支持我想并行映射的每个函数?
经验丰富的“多处理专业人员”如何解决这个问题?
更新:请注意,我实际上对处理更大的数组感兴趣,因此上面的变量src
每次调用/迭代的变化都不如那些将它分成池的工作进程。
答案 0 :(得分:6)
您总是可以传递这样的可调用对象,然后该对象可以包含共享状态:
from multiprocessing import Pool
import numpy as np
class RowProcessor(object):
def __init__(self, src):
self.__src = src
def __call__(self, row):
return np.sum(self.__src[row])
def main():
src=np.ones((100,100))
p = RowProcessor(src)
pool=Pool(processes=16)
rows = pool.map(p, range(100))
print rows
if __name__ == "__main__":
main()