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

Bre*_*ood 16 python queue multithreading multiprocessing

我正在使用Python开发一个相当大的项目,该项目需要将一个计算密集型后台任务卸载到另一个核心,这样主服务就不会变慢.当multiprocessing.Queue用于传递工作进程的结果时,我遇到了一些显然很奇怪的行为.为a threading.Thread和a 使用相同的队列进行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())
Run Code Online (Sandbox Code Playgroud)

我已经看到了,这工作得很好size = 10000,但在挂起worker_p.join()size = 100000.是什么multiprocessing.Process实例可以放入一些固有的大小限制multiprocessing.Queue?或者我在这里犯了一些明显的,根本性的错误?

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

Mak*_*cha 18

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

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

  • 谢谢,这正是我遇到的问题,并且在加入之前在父线程中出列似乎工作正常. (3认同)