我正在使用 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
,但挂在 worker_p.join()
用于 size = 100000
。 multiprocessing.Process
实例可以放入 multiprocessing.Queue
是否有一些固有的大小限制?还是我在这里犯了一些明显的、根本性的错误?
作为参考,我在 Ubuntu 10.04 上使用 Python 2.6.5。
原文由 Brendan Wood 发布,翻译遵循 CC BY-SA 4.0 许可协议
似乎底层管道已满,因此馈线线程在写入管道时阻塞(实际上是在尝试获取保护管道免受并发访问的锁时)。
检查这个问题 http://bugs.python.org/issue8237