我目前正在创建一个类,它应该使用multiprocessing
模块以多线程方式执行某些方法。我使用Pool
n
个n
工作人员执行实际计算。现在,我想为每个当前0
活跃工作人员分配n
和Queue
之间的索引,以进行其他计算。为此,我想使用共享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}}对象的预期行为,我做错了吗?或者这是某种错误?
答案 0 :(得分:2)
是的,你不应该在这里使用Namespace
。当您将Queue
对象放入manager.Namespace()
时,每个进程都将获得一个新的Queue
实例,这些新创建的队列对象的所有编写器/读取器都与父进程没有连接,因此没有工作进程将收到消息。仅改为共享Queue
。
multiprocess
模块的上下文中,worker是一个进程,而不是一个线程。