python多处理的替代使用模式避免了全局状态的扩散?

时间:2012-04-14 09:06:14

标签: multiprocessing python pool

这个(非常简化的例子)工作正常(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每次调用/迭代的变化都不如那些将它分成池的工作进程。

1 个答案:

答案 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()