我对此设置进行了一些测试,这些测试出乎意料地快速解决了我的问题:
我想从multiprocessing.Pool.map()
函数(设置参数)中调用main
。但是,对我来说,将局部定义的函数作为args之一更为简单。由于不能腌制后者,因此我尝试了将声明为全局的最懒惰的解决方案。我应该期待一些奇怪的结果吗?您会建议其他策略吗?
这是一个示例(虚拟)代码:
#!/usr/bin/env python3
import random
import multiprocessing as mp
def processfunc(arg_and_func):
arg, func = arg_and_func
return "%7.4f:%s" %(func(arg), arg)
def main(*args):
# the content of var depends of main:
var = random.random()
# Now I need to pass a func that uses `var`
global thisfunc
def thisfunc(x):
return x+var
# Test regular use
for x in range(-5,0):
print(processfunc((x, thisfunc)))
# Test parallel runs.
with mp.Pool(2) as pool:
for r in pool.imap_unordered(processfunc, [(x, thisfunc) for x in range(20)]):
print(r)
if __name__=='__main__':
main()
PS:我知道我可以在模块级别定义thisfunc
,并通过var
传递processfunc
参数,但是由于我在现实生活中的实际processfunc
已经花了一个许多参数,传递单个对象thisfunc
而不是许多参数似乎更易读...
答案 0 :(得分:1)
您现在所拥有的看起来不错,但可能对于以后的更改很脆弱。
我可能使用partial
来简化var
到全局定义函数的显式传递。
import random
import multiprocessing as mp
from functools import partial
def processfunc(arg_and_func):
arg, func = arg_and_func
return "%7.4f:%s" %(func(arg), arg)
def thisfunc(var, x):
return x + var
def main(*args):
# the content of var depends of main:
var = random.random()
f = partial(thisfunc, var)
# Test regular use
for x in range(-5,0):
print(processfunc((x, thisfunc)))
# Test parallel runs.
with mp.Pool(2) as pool:
for r in pool.imap_unordered(processfunc, [(x, f) for x in range(20)]):
print(r)
if __name__=='__main__':
main()