【发布时间】:2012-04-19 04:55:34
【问题描述】:
我正在使用 Python 处理一个相当大的项目,该项目需要将计算密集型后台任务之一卸载到另一个核心,以便不会降低主要服务的速度。在使用multiprocessing.Queue 传达工作进程的结果时,我遇到了一些明显奇怪的行为。对threading.Thread 和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())
我发现这对size = 10000 很好,但对于size = 100000 却挂在worker_p.join()。 multiprocessing.Process 实例可以放入 multiprocessing.Queue 是否有一些固有的大小限制?还是我在这里犯了一些明显的根本性错误?
作为参考,我在 Ubuntu 10.04 上使用 Python 2.6.5。
【问题讨论】:
-
我也有同样的问题。使用
Queue返回模型权重--->100000 个元素的列表---不会卡住。
标签: python multithreading queue multiprocessing