【问题标题】:Maximum size for multiprocessing.Queue item?multiprocessing.Queue 项目的最大大小?
【发布时间】:2012-04-19 04:55:34
【问题描述】:

我正在使用 Python 处理一个相当大的项目,该项目需要将计算密集型后台任务之一卸载到另一个核心,以便不会降低主要服务的速度。在使用multiprocessing.Queue 传达工作进程的结果时,我遇到了一些明显奇怪的行为。对threading.Thread 和multiprocessing.Process 使用相同的队列以进行比较,线程工作得很好,但是在将大项目放入队列后进程无法加入。观察:

import threading
import multiprocessing

class WorkerThread(threading.Thread):
    def __init__(self, queue, size):
        threading.Thread.__init__(self)
        self.queue = queue
        self.size = size

    def run(self):
        self.queue.put(range(size))


class WorkerProcess(multiprocessing.Process):
    def __init__(self, queue, size):
        multiprocessing.Process.__init__(self)
        self.queue = queue
        self.size = size

    def run(self):
        self.queue.put(range(size))


if __name__ == "__main__":
    size = 100000
    queue = multiprocessing.Queue()

    worker_t = WorkerThread(queue, size)
    worker_p = WorkerProcess(queue, size)

    worker_t.start()
    worker_t.join()
    print 'thread results length:', len(queue.get())

    worker_p.start()
    worker_p.join()
    print 'process results length:', len(queue.get())

我发现这对size = 10000 很好,但对于size = 100000 却挂在worker_p.join()。 multiprocessing.Process 实例可以放入 multiprocessing.Queue 是否有一些固有的大小限制?还是我在这里犯了一些明显的根本性错误?

作为参考,我在 Ubuntu 10.04 上使用 Python 2.6.5。

【问题讨论】:

  • 我也有同样的问题。使用Queue 返回模型权重--->100000 个元素的列表---不会卡住。

标签: python multithreading queue multiprocessing


【解决方案1】:

默认情况下 Queue 的 maxsize 是无限的,但你已经覆盖了它。在您的情况下,worker_p 正在将项目放入队列中,应该在调用加入之前释放队列。详情请参阅以下链接。 https://docs.python.org/2/library/multiprocessing.html#programming-guidelines

【讨论】:

    【解决方案2】:

    python multiprocessing: some functions do not return when they are complete (queue material too big) 的答案在并行执行任意一组函数时实现了您可能所说的“加入前出列”,其返回值被排队。

    因此,这允许将任何大小的东西放入队列中,这样您找到的限制就不会妨碍您。

    【讨论】:

      【解决方案3】:

      似乎底层管道已满,因此馈线线程在写入管道时阻塞(实际上是在尝试获取保护管道免受并发访问的锁时)。

      查看这个问题http://bugs.python.org/issue8237

      【讨论】:

      • 谢谢,这正是我遇到的问题,加入之前在父线程中出列似乎工作正常。
      • 非常感谢。只需交换 2 行:“worker_t.join() print 'thread results length:', len(queue.get())”
      • 这两行切换的原因是什么?好像在join方法之前得到东西是不合理的
      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2015-01-29
      • 2011-01-26
      • 1970-01-01
      相关资源
      最近更新 更多