我在多线程方面经验不足,因此正在尝试使类似以下内容的工作:
from multiprocessing import Process
class Node:
def __init__(self):
self.children = {}
class Test(Process):
def __init__(self, tree):
super().__init__()
self.tree = tree
def run(self):
# infinite loop which does stuff to the tree
self.tree.children[1] = Node()
self.tree.children[2] = Node()
x = Node()
t = Test(x)
t.start()
print(x.children) # random access to tree
我意识到出于各种非常明智的原因,这不应该(也不应该)起作用,但是我不确定如何使它起作用。引用文档,似乎我需要对Managers和Proxies做些事情,但是老实说,我不知道从哪里开始,或者这是否是我真正想要的。有人可以提供上述有效的示例吗?
最佳答案
multiprocessing
对implicitly shared objects的支持有限,它甚至可以共享列表和字典。
通常,multiprocessing
是shared-nothing(在初始派生之后),并且依赖于进程之间的显式通信。这增加了开销(实际上多少取决于进程之间的交互类型),但巧妙地避免了多线程编程的许多陷阱。 multiprocessing
的高级构建块支持主/从模型(尤其是Pool class),主模型分发工作项,从模型对其进行操作,并返回结果。
在多个进程之间保持状态同步可能会导致开销过大,具体取决于它们更改的频率。
TL; DR :可以完成,但可能不应该这样做。
import time, multiprocessing
class Test(multiprocessing.Process):
def __init__(self, manager):
super().__init__()
self.quit = manager.Event()
self.dict = manager.dict()
def stop(self):
self.quit.set()
self.join()
def run(self):
self.dict['item'] = 0
while not self.quit.is_set():
time.sleep(1)
self.dict['item'] += 1
m = multiprocessing.Manager()
t = Test(m)
t.start()
for x in range(10):
time.sleep(1.2)
print(t.dict)
t.stop()
multiprocessing
示例显示了如何为更多complicated objects创建代理,这应允许您实现问题中的树结构。关于python - 如何与流程分支共享对象树?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15539777/