我想执行以下任务:在主程序'main.py'中,我定义了一些输入参数,使用函数f()基于这些参数进行计算并存储结果。函数f()和一些参数在中央模块'test.py'中定义。
我必须为大量参数执行此操作,因此希望为每个CPU提供一组参数,执行计算并返回结果,然后将结果存储在数组'data'中。
问题:每个进程都需要访问和定义模块'test.py'中的值,我希望避免进程之间的任何通信/干扰。
我附上了一个最小的工作示例。主文件main.py和模块test.py
如果执行计算,则会看到'data'中的结果是正确的,但print语句返回的对(a,b)与默认值不对应。
首先,我想了解这里发生的事情。似乎每个进程打印(a,b)由先前进程定义,然后定义新值并产生正确的结果。
其次,目前该程序正常工作(即使对于较大的数据集和更复杂的计算),但我不希望通过进程之间的干扰来冒错误结果。有没有办法避免流程之间的任何沟通?也许每个进程都获得模块的副本并使用此副本进行计算?
答案 0 :(得分:1)
我认为你的问题是" print"语句是打印父main.py进程看到的ta和tb,你已经在calc(x)函数中分配了(我不认为你可以在子工作进程中打印,但你绝对不是因此我不知道如何看到默认值(1,1)。在分配新值之前打印ta和tb,因此它会打印旧值吗?
如果您确实希望确保所有流程完全独立于主流程,您可以在一个结构中传递所有参数,即。在test.py中定义
def f(struct):
return (struct.a+struct.b)**struct.s
并在你的main.py中列出这些结构。所以我猜你定义一个结构并填充它
class myStruct():
def __init__(self,s,a=1,b=1): ##Here you've set the default a and b values to 1
self.a=a
self.b=b
self.s=s
然后,您可以填充这些结构的列表,然后将列表传递给multiprocessing.pool
不确定这是否非常有用,但我没有足够的声誉来发表评论。
Cheeers mate and goodluck。