我正在使用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)
我也可以按照问题第一段中的解释去做吗?
答案 0 :(得分:0)
您的两个版本之间实际上有两个很大的区别,而且非常明显。
在第一个示例中,您正在呼叫newProc3
和newProc4
并传递这些呼叫的结果-在这种情况下为None
-作为{ group
的{1}}自变量。
在第二个示例中,您将Process
/ newProc3
函数作为newProc4
参数传递。
这意味着在第一种情况下,您的target
函数都在父进程中执行,这就是为什么您似乎获得预期结果的原因-但实际上您没有:newProcX
没有目标,因此他们根本不执行任何操作。
第二个示例是设置流程的正确方法-通过将其作为目标传递给可调用对象-但由于这些流程是不同的流程,因此父流程Process
不会受到影响。
如果要在进程之间共享数据,则必须使用C.staticDict
作为explained in the fine manual。