2016-01-06 78 views
2

語境爲什麼Python的多隊列有一個緩衝區和管

我一直在尋找的源代碼SEE HERE多處理隊列Python 2.7並有一些問題。

  • deque用於緩衝區,放在隊列上的任何項目都附加到deque上,但get()會使用管道。

  • 我們可以看到,在投入期間,如果飼養線程尚未啓動,它將啓動。

  • 線程將彈出線程中的對象並將它們發送到上述管道的讀取端。

問題

  • 那麼,爲什麼要使用雙端隊列和管?

  • 難道只有使用deque(或任何其他具有FIFO行爲的數據結構)並同步push和pop?

  • 同樣不能也只是使用一個管道,包裝發送和recv?

也許這裏有一些東西我缺少,但飼養線程彈出物品,並把它們放在管道上似乎是矯枉過正。

回答

0

出隊只能在一個進程的內存,以便用它來進程之間傳遞的數據是不可能的(。*)

你可以使用只是一個Pipe,但那麼你就需要用鎖來保護它,我想這就是爲什麼引入了一個出列隊列。

2

multiprocessing.Queue是能夠在多個進程上運行的標準Queue的端口。因此它試圖重現相同的行爲。

A deque是一個列表,兩邊都有快速的插入/提取,理論上是無限大小。它非常適合表示堆棧或隊列。但它不適用於不同的流程。

A Pipe更像一個套接字,允許跨進程傳輸數據。管道是操作系統對象,它們的實現因操作系統而異。此外,管道的尺寸有限制,。如果你填充管道,你的下一個電話send將阻塞,直到其另一側不會被排空。

如果您想公開Queue能夠以與標準類似的方式在多個進程中工作,則需要以下功能。

  • 能夠存儲在其中還沒有被消耗的到達順序的消息的緩衝器。
  • 一個能夠跨不同進程傳輸這些消息的通道。
  • 原子putget方法能夠將控制權留給用戶何時阻止程序流。

使用一個deque一個Thread和一個Pipe是提供這些功能的最簡單的方法之一,但它不是唯一的一個。

我個人更喜歡使用裸管來讓進程進行通信,因爲它使我能夠更好地控制應用程序。

相關問題