1

我在多线程方面没有太多经验,我正在尝试使以下工作:

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

4

2 回答 2

2

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

于 2013-03-21T05:41:24.643 回答
2

multiprocessing隐式共享对象的支持有限,甚至可以共享列表和字典。

一般来说,multiprocessing它是无共享的(在初始分叉之后)并且依赖于进程之间的显式通信。这增加了开销(多少实际上取决于进程之间的交互类型),但巧妙地避免了多线程编程的许多陷阱。支持主/从模型的高级构建块multiprocessing(尤其是Pool 类),主节点分发工作项,从节点对它们进行操作,返回结果。

在多个进程之间保持状态同步可能会产生令人望而却步的开销,具体取决于它们更改的频率。

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示例展示了如何为更复杂的对象创建代理,这应该允许您在问题中实现树结构。

于 2013-03-24T14:50:43.887 回答