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