这个(极其简化的)例子在 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()
当然,那样做行不通(卡住了,无法pickle某些东西)。
这里的示例很简单,但是当您添加多个“process”函数,并且每个函数都依赖于多个其他输入时...好像它变得有点像30年前用BASIC编写的东西。尝试使用类来聚合具有适当功能的状态似乎是一个明显的解决方案,但在实践中并不那么容易。
是否有一些推荐的模式或样式可用于使用multiprocessing.pool,以避免支持我要并行映射的每个函数的全局状态的增殖?
有经验的“多进程专家”如何处理这种情况?
更新:请注意,我实际上对处理更大的数组感兴趣,因此上述的变体 pickle src
每个调用/迭代都不如将其分叉到池的工作进程中。