【问题标题】:Object inside a threaded multiprocess is empty线程多进程内的对象为空
【发布时间】:2015-07-22 15:42:28
【问题描述】:

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

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

这是一些代码/输出:

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 个项目。

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: python multithreading python-multiprocessing


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多