我在多线程方面经验不足,因此正在尝试使类似以下内容的工作:

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做些事情,但是老实说,我不知道从哪里开始,或者这是否是我真正想要的。有人可以提供上述有效的示例吗?

最佳答案

multiprocessingimplicitly shared objects的支持有限,它甚至可以共享列表和字典。

通常,multiprocessingshared-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/

10-12 22:36