多处理的最大大小.Queue项目?

时间:2012-04-05 12:42:08

标签: python multithreading queue multiprocessing

我正在开发一个相当大的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。

3 个答案:

答案 0 :(得分:18)

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

请检查此问题http://bugs.python.org/issue8237

答案 1 :(得分:2)

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

答案 2 :(得分:1)

python multiprocessing: some functions do not return when they are complete (queue material too big)的答案在加入“并行执行一组任意函数,其返回值排队等待”之前,通过“出列”来实现你可能的意思。

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