2013-02-07 183 views
4

直從Python docsPython的多處理隊列可靠性,隊列VS SimpleQueue VS JoinableQueue

類multiprocessing.Queue([MAXSIZE])

...

QSIZE() 返回隊列的近似大小。由於多線程/多處理語義,這個數字是不可靠的。

empty() 如果隊列爲空則返回True,否則返回False。由於多線程/多處理語義,這是不可靠的。

而且我憑經驗發現這對於Queue尤其如此,empty()

在我的代碼我有一堆的進程(每個相同的主進程的子),並且每個具有在其run方法如下:

while self.active: 
    if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0): 
     try: 
      self.exclusive_queue.put(self.general_queue.get(timeout=self.queue_timeout)) 
     except Queue.Empty as empty_queue: 
      continue 
    else: 
     task = self.exclusive_queue.get() 
     self.compute(task) 

基本上,處理等待在general_queue工作,但首先檢查它的exclusive_queue。主進程可以將任務放入進程的常規隊列或排隊隊列中。現在,在if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0)中,我首先使用了一個self.exclusive_queue.empty(),這導致了相當奇怪的行爲(qsize()爲30+和empty() = True)。

那麼,我這個標題是 - 在文檔爲multiprocessing.queues.SimpleQueue寫到:

空() 返回真,如果隊列爲空,否則爲false。

根本沒有提到可靠性。 SimpleQueue.empty()是可靠的嗎?

第二個是multiprocessing.JoinableQueue由於task_done()機制的可靠或「更」可靠比Queue

這樣的方法可以被認爲是正確的,或者可能是回調方法(通過兒童之間的共享管道端點)更合適嗎?

回答

3

不是直接的答案,但我已經開始越來越多地依賴守護條件迭代輸入隊列。還有就是多模塊的文檔中的一個例子:

def worker(input, output): 
    for func, args in iter(input.get, 'STOP'): 
     result = calculate(func, args) 
     output.put(result) 

因此,當你輸入隊列完成後,您只需put許多STOP串,或任何守護你選擇,到隊列中,你已經開始過程。

+0

是的,我幾乎在我的服務器中使用相同的方法。如果'compute'得到'None',它會將'active'變爲'False'。但是,正如你在我的案例中所看到的,我有兩個隊列需要等待 - 「獨佔」和「普通」隊列的想法是「如果排他是空的,從一般來說」,但是,因爲我希望能夠停止即使在通用隊列中有條目,我也會處理這些'None'。 – dmg