【问题标题】:Understanding static class variables across processes in Python了解 Python 中跨进程的静态类变量
【发布时间】:2018-09-18 10:41:31
【问题描述】:

我正在使用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' 保留在第二个 worker 中,但在示例 2 中并非如此。那么,下面两个之间有什么区别?

newProc4Obj = mup.Process(newProc4())

newProc4Obj = mup.Process(target=newProc4)

也可以按照问题第一段中的说明进行操作吗?

【问题讨论】:

    标签: python python-3.x multithreading static multiprocessing


    【解决方案1】:

    实际上,您的两个版本之间存在两个很大且非常明显的差异。

    在第一个示例中,您正在调用 newProc3newProc4 并将这些调用的 结果 - 在本例中为 None - 作为 @987654326 的 group 参数@。

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

    这意味着在第一种情况下,您的 newProcX 函数都在父进程中执行,这就是您 似乎 获得预期结果的原因 - 但实际上您没有: Process 没有目标,所以他们根本不执行任何操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多