线程多进程内的对象为空

时间:2015-07-22 15:42:29

标签: python multithreading python-multiprocessing

我在这里有一个奇怪的情况。我有一个多进程,反过来有一个线程。这里的想法是将附加到队列的工作卸载到线程(我试图在每个python进程中获得CPU使用率)。

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

这是一些代码/输出:

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项时,工作人员会看到其中的项目。

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:0)

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