繁体   English   中英

了解Python中跨进程的静态类变量

[英]Understanding static class variables across processes in Python

我正在使用multiprocessing模块创建与目标程序具有相同类的不同守护程序工作器。 此类根据上下文动态导入不同的模块,并将这些模块存储在类范围的静态字典中。 我开始考虑到,由于使用了类级别的静态字典,所有将来的工作人员(可能已经终止)所做的所有输入都可以在将来的所有工作人员中使用/显示吗?

因此,我调试并意识到,这确实没有发生,过去的工人的进口并没有像现在所期望的那样成为未来的工人。 但是开始想知道为什么会这样。 因此,我创建了一个模仿相同示例的小示例。 以下是两个示例。 两者都包含相同的Cmodule.py ,其中包含工作程序的目标类C 区别仅在于temp.py ,也仅在于mup.Process()参数。 第一个示例失败了,因为在过去的工作人员中存在由过去的工作人员添加的C类静态字典的成员。 尽管第二个例子不是这样。

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-temp.py

import multiprocessing as mup
from Cmodule import *

def newProc3():
    c = C(True)

def newProc4():
    c = C(False)

newProc3Obj = mup.Process(newProc3())
newProc4Obj = mup.Process(newProc4())
newProc3Obj.start()
newProc4Obj.start()

示例2-temp.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'保留在第二个工作程序中,但示例2并非如此。那么,下面两个之间的区别是什么?

newProc4Obj = mup.Process(newProc4())

newProc4Obj = mup.Process(target=newProc4)

如问题第一段所述,我也可以尝试做什么?

实际上,您的两个版本之间存在两个非常明显的区别。

在第一个示例中,您要调用newProc3newProc4 ,并将这些调用的结果 (在本例中为None )作为Processgroup参数传递。

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

这意味着在第一种情况下,您的newProcX函数都在父进程中执行,这就是为什么您似乎能获得预期结果的原因-但实际上您没有:该Process没有目标,因此它们没有目标执行任何事情。

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

如果要在进程之间共享数据,则必须使用精细手册中所述Queue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM