【发布时间】: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