1

我目前正在创建一个类,该类应该使用该multiprocessing模块以多线程方式执行某些方法。Pool我使用一个n工人执行真正的计算。现在我想为每个当前n活跃的工作人员分配一个索引0n用于其他计算。为此,我想使用 sharedQueue以某种方式分配索引,即每次都没有两个工人具有相同的 id。为了在不同线程之间共享Queue类内部相同的内容,我想将其存储在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()

在这段代码中,执行在第二个 print 语句之前停止 - 因此,我认为实际上没有数据写入Queue. 当我删除namespace相关的东西时,代码可以完美地工作。这是multiprocessings 对象的预期行为吗?我做错了什么吗?或者这是某种错误?

4

1 回答 1

2

是的,你不应该Namespace在这里使用。当您将Queue对象放入时manager.Namespace(),每个进程都会获得一个新Queue实例,这些新创建的队列对象的所有写入者/读取者都与父进程没有联系,因此工作进程将不会收到任何消息。只分享一个Queue

顺便说一句,您多次提到“线程”,但在multiprocess模块的上下文中,工作者是一个进程,而不是一个线程。

于 2017-10-24T15:01:07.980 回答