线程多进程中的对象为空

Object inside a threaded multiprocess is empty

我这里有一个奇怪的情况。我有一个多进程,它又有一个线程。这里的想法是将附加到队列的工作卸载到线程(我试图让我的 CPU 使用率达到每个 python 进程)。

无论如何,这是奇怪的部分。我将我的结果附加到双端队列,并在试图通过队列发送它的线程内。但是,即使对象 ID 相同,线程也看不到附加到双端队列的结果。

这是一些 code/output:

class QueueAppender(Thread):
    def __init__(self, queue=None, read_deque=None, *args, **kwargs):
        super(QueueAppender, self).__init__(*args, **kwargs)
        self.queue = queue
        self.contents = read_deque

    def run(self):
        while True:
            print 'queue', id(self.contents), len(self.contents)
            if self.contents:
                results = self.contents.popleft()
                if results is None:
                    return
                self.queue.put(results)
            else:
                time.sleep(0.01)

class Worker(Process):
    def __init__(self, queue=None, results=None):
        super(Worker, self).__init__()
        self.queue=queue
        self.results = results # a Queue as well
        self.read_deque = deque()
        self.queuethread = QueueAppender(queue=self.results, read_deque=self.read_deque)
        self.queuethread.start()

    def run(self):
        results = self.results
        get_func = self.queue.get
        reads = get_func()
        while reads is not None:
            result_batch = []
            for read in reads:
                    # do some work here
                    result_batch.append(read)
            self.read_deque.append(result_batch)
            print 'worker', id(self.read_deque), len(self.read_deque)
            reads = get_func()
        self.read_deque.append(None)
        self.t.join()

奇数部分是输出:

worker 140413597195744 6
queue 140413597195744 0
queue 140413597195744 0
queue 140413597195744 0
worker 140413597195744 7
queue 140413597195744 0
queue 140413597195744 0
queue 140413597195744 0

对我来说,这表示他们都在访问相同的内存,但工作人员看到其中的项目,而队列看到 0 个项目。

知道为什么会这样吗?

问题是线程是在 init 中创建的。将创建移动到 运行 过程解决了这个问题。