簡體   English   中英

python 隊列和多處理隊列:它們的行為如何?

[英]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.Queuemultiprocessing一起使用。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM