2014-07-06 51 views
0

我想执行以下任务:在主程序'main.py'中,我定义了一些输入参数,使用函数f()和存储结果。函数f()和一些参数在中央模块“test.py”中定义。Python多重处理:避免在进程之间通过模块进行通信

我必须为大量参数做这件事,因此要给每个CPU一组参数,执行计算并返回结果,然后将结果存储在数组'data'中。

问题:每个进程都需要访问和定义模块'test.py'中的值,我希望避免进程之间的任何通信/干扰。

我附上了一个最小的工作示例。主文件main.py和模块test.py

如果一个执行人们可以看出在“数据”的结果是正确的计算,但打印语句返回对(A,B)不对应于默认值。

起初,我想了解这里发生了什么。看来,每个进程打印(a,b)由先前的进程定义,然后定义新的值并产生正确的结果。其次,目前该程序可以工作(即使对于较大的数据集和更复杂的计算),但我不想冒着由进程之间的干扰导致错误结果的风险。有没有办法避免流程之间的任何沟通?也许每个进程都获得模块的副本,并使用此副本进行计算?

回答

1

我认为你的问题是“print”语句正在打印父main.py进程看到的ta和tb,你已经在calc(x)函数中赋值了(我认为你不能打印在童工过程中,但你肯定没有,因此我看不到你如何看到默认值(1,1)。在分配新值之前打印ta和tb,因此它会打印旧值?

如果你真的想确保你所有的过程是独立的100%主进程,你可以通过所有的arguements在一个结构即定义您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。

+0

是的,打印语句返回它在当时获得的模块对(a,b)。但是,这并不是真正的可预测性,我不明白为什么计算结果仍然正确。我的意思是,一名童工可以重新定义t.a,t.b,而另一名童工使用这个数值来给出错误的结果。 我想你的建议没有办法做出一个包含参数的结构。缺点是我必须在整个程序中携带包含大量参数的结构。我会考虑的,谢谢。 – hauntergeist

+0

我在配对之前就有这个问题,这取决于你的“a”和“b”值多久改变一次,我假设这只是一个代表性的功能,因为你不能公开你的真实源代码。如果许多具有不同s值的对象使用相同的a和b,并且希望将它们从内存中移除,则可以使用3层系统,其中祖父进程使用a和b值创建父进程,然后创建s值列表它映射到。如果计算完成,你可以结束父进程清除内存。 – PythonFan