Manger.Namespace()中的多处理队列

时间:2017-10-20 19:46:53

标签: python queue multiprocessing pathos

我目前正在创建一个类,它应该使用multiprocessing模块以多线程方式执行某些方法。我使用Pool nn工作人员执行实际计算。现在,我想为每个当前0活跃工作人员分配nQueue之间的索引,以进行其他计算。为此,我想使用共享Queue以某种方式分配索引,即每次没有两个worker具有相同的id。要在不同线程之间共享类中的相同Manager.Namespace(),我想将其存储在Queue内。但是这样做,我在from multiprocess import Process, Queue, Manager, Pool, cpu_count class A(object): def __init__(self): manager = Manager() self.ns = manager.Namespace() self.ns.q = manager.Queue() def foo(self): for i in range(10): print(i) self.ns.q.put(i) print(self.ns.q.get()) print(self.ns.q.qsize()) a = A() a.foo() 时遇到了一些问题。因此,我创建了我的问题的最小版本,最终得到了这样的结果:

Queue

在此代码中,执行在第二个print语句之前停止 - 因此,我认为没有数据实际写入namespace。当我删除multiprocessing相关内容时,代码可以正常运行。这是{{1}}对象的预期行为,我做错了吗?或者这是某种错误?

1 个答案:

答案 0 :(得分:2)

是的,你不应该在这里使用Namespace。当您将Queue对象放入manager.Namespace()时,每个进程都将获得一个新的Queue实例,这些新创建的队列对象的所有编写器/读取器都与父进程没有连接,因此没有工作进程将收到消息。仅改为共享Queue

顺便说一句,你提到了"线程"很多时候,但在multiprocess模块的上下文中,worker是一个进程,而不是一个线程。