优化多处理.Pool与昂贵的初始化

时间:2016-08-05 18:37:34

标签: python python-3.5 python-multiprocessing pool object-initializers

这是一个完整的简单工作示例

import multiprocessing as mp
import time
import random


class Foo:
    def __init__(self):
        # some expensive set up function in the real code
        self.x = 2
        print('initializing')

    def run(self, y):
        time.sleep(random.random() / 10.)
        return self.x + y


def f(y):
    foo = Foo()
    return foo.run(y)


def main():
    pool = mp.Pool(4)
    for result in pool.map(f, range(10)):
        print(result)
    pool.close()
    pool.join()


if __name__ == '__main__':
    main()

我如何修改它,以便Foo仅由每个工作人员初始化一次,而不是每个任务?基本上我希望init调用4次,而不是10次。我使用的是python 3.5

2 个答案:

答案 0 :(得分:8)

处理这类事情的预期方法是通过initializer构造函数的可选initargsPool()参数。它们的存在恰恰是为了在创建工作进程时为您提供一种方法。所以,例如,添加:

def init():
    global foo
    foo = Foo()

并将Pool创建更改为:

pool = mp.Pool(4, initializer=init)

如果需要将参数传递给每进程初始化函数,那么您还需要添加一个适当的initargs=...参数。

注意:当然你也应该删除

foo = Foo()

来自f()的行,以便您的函数使用foo创建的全局init()

答案 1 :(得分:2)

最明显的,懒惰的负载

_foo = None
def f(y):
    global _foo
    if not _foo:
       _foo = Foo()
    return _foo.run(y)