multiprocessing.Queue 项目的最大大小?

新手上路,请多包涵

我正在使用 Python 开发一个相当大的项目,该项目需要将计算密集型后台任务之一卸载到另一个核心,这样主服务就不会变慢。在使用 multiprocessing.Queue 传达工作进程的结果时,我遇到了一些明显奇怪的行为。对 threading.Threadmultiprocessing.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 ,但挂在 worker_p.join() 用于 size = 100000multiprocessing.Process 实例可以放入 multiprocessing.Queue 是否有一些固有的大小限制?还是我在这里犯了一些明显的、根本性的错误?

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

原文由 Brendan Wood 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

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

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

原文由 Maksym Polshcha 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题