Python 3多处理进程继承,更新变量

时间:2018-06-04 08:28:11

标签: python-3.x multiprocessing shared-memory

我正在尝试更新Process herited类的run方法中使用的Pipe列表。 我知道在启动Process类时,会创建此类的完整副本。 所以我认为使用Manager.list可以解决问题,但是当我尝试本地删除已关闭的管道时,会引发ValueError

以下是我正在尝试实现的代码的一个小例子

import multiprocessing
from select import select


class A(multiprocessing.Process):
    def __init__(self):
        self.manager = multiprocessing.Manager()
        self.pipes = self.manager.list()
        super(A, self).__init__()

    def addPipe(self, pipe):
        self.pipes.append(pipe)

    def run(self):
        while True:
            r, c, v = select(self.pipes, [], [])
            for x in r:
                m = x.recv()
                if m is None:
                    self.pipes.remove(x)
                else:
                    print(m)
            if len(self.pipes) <= 0:
                break


if __name__ == '__main__':
    r, s = multiprocessing.Pipe()
    r2, s2 = multiprocessing.Pipe()
    a = A()

    a.addPipe(r)
    a.start()
    s.send('message 1.0')
    a.addPipe(r2)
    s2.send('message 2.0')
    s.send(None)
    s2.send('message 2.1')
    s2.send(None)
    s.close()
    s2.close()
    a.join()
    r.close()
    r2.close()

当我打印select返回的结果时,内存中的连接地址与创建的Pipe对象的地址不同,因此无法从列表中删除。

我尝试删除select,并在每个Pipe上通过简单循环和轮询验证替换它。但是内存地址仍然与run方法中使用的管道列表不同。

我的主要目标是能够将管道添加到正在运行的Process herited类。

0 个答案:

没有答案