Python 多处理的最大大小。队列项目?

Python 多处理的最大大小。队列项目?,python,multithreading,queue,multiprocessing,Python,Multithreading,Queue,Multiprocessing,我正在用Python进行一个相当大的项目,该项目需要将一个计算密集型后台任务卸载到另一个核心,这样主服务就不会慢下来。我在使用多处理.Queue传递工作进程的结果时遇到了一些明显奇怪的行为。对于线程.threading和多处理.Process使用相同的队列进行比较,线程工作正常,但在将大项目放入队列后,进程无法加入。注意: import threading import multiprocessing class WorkerThread(threading.Thread): def

我正在用Python进行一个相当大的项目,该项目需要将一个计算密集型后台任务卸载到另一个核心,这样主服务就不会慢下来。我在使用
多处理.Queue
传递工作进程的结果时遇到了一些明显奇怪的行为。对于
线程.threading
多处理.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\u p.join()
多处理.Process
实例可以放入
多处理.Queue
中的内容是否有一些固有的大小限制?还是我犯了一些明显的根本性错误


作为参考,我在Ubuntu10.04上使用的是Python 2.6.5。

底层管道似乎已满,因此进料器线程阻塞了对管道的写入(实际上是在尝试获取锁以防止管道并发访问时)

检查此问题

在加入“并行执行任意函数集,其返回值排队”之前,实现您可能指的“出列”的答案


因此,这允许将任意大小的内容放入队列,以便您找到的限制不会妨碍您。

默认情况下,队列的最大大小是无限的,但您已经克服了这一点。在您的情况下,worker\p正在将项目放入队列中,应在调用join之前释放队列。有关详细信息,请参阅下面的链接。

谢谢,这正是我遇到的问题,在加入之前在父线程中退出队列似乎很好。非常感谢。只需交换两行:“worker\u t.join()打印“thread results length:”,len(queue.get())“切换这两条线路的原因是什么?在加入方法之前获得一些东西似乎是不合理的。我这里有一个相同的问题。使用
Queue
返回模型权重——一个包含>100000个元素的列表——但它不会被卡住。