这是一个完整的简单工作示例
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
答案 0 :(得分:8)
处理这类事情的预期方法是通过initializer
构造函数的可选initargs
和Pool()
参数。它们的存在恰恰是为了在创建工作进程时为您提供一种方法。所以,例如,添加:
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)