2012-04-05 34 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