我对这个设置做了一些测试,出乎意料地出现了我的问题的快速修复:
我想从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
而不是许多参数似乎更具可读性。 ..
你现在拥有的东西看起来还不错,但对于以后的改变可能会很脆弱。
我可能会使用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()