2009-05-29 121 views
16

此示例代碼工程(我可以寫在文件中的東西):python隊列和多處理隊列:他們如何表現?

from multiprocessing import Process, Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

,而不是這個其他樣本不:(ERRORMSG:「模塊」對象不是可調用的)

import Queue 

queue = Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

這個其他樣本不是(我不能在文件中寫什麼東西):

import Queue 

queue = Queue.Queue() 
def _printer(self, queue): 
    queue.put("hello world!!") 

def _cmdDisp(self, queue): 
    f = file("Cmd.log", "w") 
    print >> f, queue.get() 
    f.close() 

有人可以解釋這些差異嗎?和做的權利?

+2

注意:你也可以像這樣導入:「從隊列導入隊列」 - 這樣你就可以像第一次嘗試一樣調用Queue.Queue - 「隊列()」 – Bob 2014-10-04 08:22:50

回答

46

對於第二個示例,您已經自己給出了說明--- Queue是一個模塊,它不能被調用。

對於第三個示例:我假設您使用Queue.Queuemultiprocessing。一個Queue.Queue將不會在進程之間共享。如果在進程之前聲明Queue.Queue,那麼每個進程將收到它的副本,然後獨立於其他進程。父母在開始孩子之前放置在Queue.Queue中的物品將會供每個孩子使用。家長在開始孩子後放置在Queue.Queue中的項目將僅供家長使用。 Queue.Queue用於在同一進程內使用不同的線程之間的數據交換(使用threading模塊)。多處理隊列用於在不同的Python 進程之間進行數據交換。雖然API看起來很相似(它的設計就是這樣),但底層機制卻有着根本的不同。

  • multiprocessing隊列通過酸洗(序列化)對象交換數據並通過管道發送它們。
  • Queue.Queue使用線程與鎖/互斥體之間共享的數據結構以實現正確的行爲。
+3

由於這個行爲是多處理的.Queue會產生你放入的內容的副本,而queue.Queue會產生你輸入的內容的參考。 對我來說,這從文檔中是完全不清楚的。 – Pelle 2016-07-01 08:38:45