Python多处理:避免进程之间通过模块进行通信

时间:2014-07-06 16:22:34

标签: python module multiprocessing

我想执行以下任务:在主程序'main.py'中,我定义了一些输入参数,使用函数f()基于这些参数进行计算并存储结果。函数f()和一些参数在中央模块'test.py'中定义。

我必须为大量参数执行此操作,因此希望为每个CPU提供一组参数,执行计算并返回结果,然后将结果存储在数组'data'中。

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

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

如果执行计算,则会看到'data'中的结果是正确的,但print语句返回的对(a,b)与默认值不对应。

首先,我想了解这里发生的事情。似乎每个进程打印(a,b)由先前进程定义,然后定义新值并产生正确的结果。

其次,目前该程序正常工作(即使对于较大的数据集和更复杂的计算),但我不希望通过进程之间的干扰来冒错误结果。有没有办法避免流程之间的任何沟通?也许每个进程都获得模块的副本并使用此副本进行计算?

1 个答案:

答案 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。