[英]python queue & multiprocessing queue: how they behave?
此示例代碼有效(我可以在文件中寫入一些內容):
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()
而不是這個其他示例:(錯誤消息:“模塊”對象不可調用)
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()
有人可以解釋這些差異嗎? 和權利做什么?
對於您的第二個示例,您已經自己進行了解釋--- Queue
是一個模塊,無法調用。
對於第三個示例:我假設您將Queue.Queue
與multiprocessing
一起使用。 Queue.Queue
不會在進程之間共享。 如果Queue.Queue
在進程之前聲明,那么每個進程都會收到它的副本,然后獨立於其他進程。 在啟動子項之前由父項放置在Queue.Queue
的項目將可供每個子項使用。 啟動子項后由父項放置在Queue.Queue
的項目Queue.Queue
父項可用。 Queue.Queue
用於同一進程內不同線程之間的數據交換(使用 線程模塊)。 多處理隊列用於不同 Python進程之間的數據交換。 雖然 API 看起來很相似(它就是這樣設計的),但底層機制卻有着根本的不同。
multiprocessing
隊列通過酸洗(序列化)對象並通過管道發送它們來交換數據。Queue.Queue
使用在線程和鎖/互斥鎖之間共享的數據結構以實現正確的行為。被創建用於在threading
模塊產生的並發環境中工作。
每個線程在它們之間共享對Queue.Queue
對象的引用。 這里沒有數據的復制或序列化,所有線程都可以訪問隊列中的相同數據。
被創建用於在multiprocessing
模塊產生的並行環境中工作。
每個進程都可以訪問其中的multiprocessing.Queue
對象的副本。 隊列的內容通過pickle 序列化跨進程復制。 .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.