如何与进程fork共享对象树?

时间:2013-03-21 04:53:27

标签: python multithreading multiprocessing

我对多线程没有多少经验,我正试图得到类似下面的工作:

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

2 个答案:

答案 0 :(得分:2)

在我看来,你想要的是实际的多线程,而不是多处理。使用线程而不是进程,您可以做到这一点,因为线程在同一进程中运行,共享所有内存,因此共享数据。

答案 1 :(得分:2)

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创建代理,这应该允许您在问题中实现树结构。