2012-04-05 136 views
11

我正在开发一个相当大的Python项目,要求将计算密集型后台任务之一卸载到另一个内核,以便主服务不会变慢。当使用multiprocessing.Queue来传达工作进程的结果时,我遇到了一些显然很奇怪的行为。为了比较目的,对threading.Threadmultiprocessing.Process使用相同的队列,该线程工作得很好,但是在将大项放入队列后进程无法加入。注意:multiprocessing.Queue项目的最大尺寸?

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。

回答

16

似乎底层管道已满,所以进给程序线程在写入管道时会阻塞(实际上,当试图获取保护管道免于并发访问的锁定时)。

检查这个问题http://bugs.python.org/issue8237

+2

谢谢,这正是我遇到的问题,并且在加入之前在父线程中出列似乎工作正常。 – 2012-04-05 15:42:25

+1

非常感谢你。 (')(')(')()'' – Catbuilts 2016-09-30 11:22:52