我正在尝试更新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类。