理解Python中进程间的静态类变量

2024-09-27 23:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用multiprocessing模块创建不同的守护进程工作进程,它们的类与目标相同。该类根据上下文动态导入不同的模块,并将这些模块存储在类作用域的静态字典中。我开始思考,由于类级别的静态字典,所有过去的工人(可能已经被终止)所做的所有导入在所有未来的工人中都是可用的/存在的吗?在

所以我调试并意识到这并不是真的发生,过去工人的进口也不是现在的未来工人,正如预期的那样。但开始想为什么会这样。所以我创造了一个小例子来模仿。下面是两个例子。两者都涉及相同的Cmodule.py,其中包含工作者的目标类C。区别就在temp.py上,那也只是在{}的参数中。第一个例子失败了,因为过去的worker添加的类C中的静态dict的成员存在于将来的worker中。第二个例子不是这样。在

Cmodule.py

class C:
    staticDict = {}

    def __init__(self, condition):
        if condition:
            C.staticDict['a'] = 'a'
        else:
            C.staticDict['b'] = 'b'
        self.printStaticDict()

    def printStaticDict(self):
        print(C.staticDict)

示例1-温度py

^{pr2}$

例2-温度py

import multiprocessing as mup
from Cmodule import *

def newProc3():
    c = C(True)

def newProc4():
    c = C(False)

newProc3Obj = mup.Process(target=newProc3)  //this differs from example 1
newProc4Obj = mup.Process(target=newProc4)  //this differs from example 1
newProc3Obj.start()
newProc4Obj.start()

示例1-输出

{'a': 'a'}
{'a': 'a', 'b': 'b'}

示例2-输出

{'a': 'a'}
{'b': 'b'}

注意,在示例1输出中,键值'a':'a'保留在第二个worker中,但在示例2中不是这样。那么,下面两个有什么区别呢?在

newProc4Obj = mup.Process(newProc4())

以及

newProc4Obj = mup.Process(target=newProc4)

同样的,我想做的事情是否可以如问题第一段所述?在


Tags: 模块pyself示例def静态process例子
1条回答
网友
1楼 · 发布于 2024-09-27 23:27:40

实际上,两个版本之间有两个非常明显的差异。在

在第一个示例中,调用newProc3newProc4,并将这些调用的结果传递给{},作为Processgroup参数。在

在第二个示例中,传递newProc3/newProc4函数作为target参数。在

这意味着在第一种情况下,newProcX函数都是在父进程中执行的,这就是为什么看起来能得到预期的结果-但实际上你没有:这个Process没有目标,所以它们根本不执行任何操作。在

第二个例子是设置进程的正确方法-通过将可调用的作为目标传递给它-但是由于这些是不同的进程,父进程C.staticDict不会受到影响。在

如果要在进程之间共享数据,必须使用Queue作为explained in the fine manual。在

相关问题 更多 >

    热门问题