[英]Are Python Multiprocessing Queues Ordered?
如果這很明顯,請原諒我,但我無法從文檔中判斷使用隊列時的輸出是否已排序。 也就是說,如果輸入是[1, 2, 3]
輸出會是f(1), f(2), f(3)
還是它們會亂序?
編輯:我知道輸入是在 FIFO 中處理的。 但是FIFO檢索是否一定保證結果也按順序返回?
不,他們將按照完成的順序進入隊列,而不是按照開始的順序。 這意味着如果您以特定順序開始您的流程,它們可能會或可能不會按照該順序完成。 如果順序對您很重要,您應該將起始順序與隊列中的結果一起傳回,可能作為元組queue.put((order, result))
。 這是一個示例,顯示您從隊列中獲得的隨機順序。 (這仍然是先進先出)
import multiprocessing
import random
import time
def square(x, queue):
# Sleep for a value between 0 and 1.
time.sleep(random.random())
queue.put(x**2)
queue = multiprocessing.Queue()
for i in range(10):
process = multiprocessing.Process(target = square, args = (i, queue))
process.start()
results = []
for i in range(10):
results.append(queue.get())
print (results)
這給了我 [25, 16, 9, 0, 36, 64, 81, 1, 49, 4]。
假設您的任務相當簡單,我總是更喜歡使用 Python 的Pool
功能及其相應的pool.map()
函數,它確實保證根據輸入順序保留輸出順序。
多處理隊列從來沒有亂序。 從文檔中它清楚地提到了 3 種類型。 FIFO
、 LIFO
和優先隊列(一種自定義順序的方法)。 默認順序即。 class Queue.Queue
正在使用FIFO
在 FIFO 隊列中,添加的第一個任務是第一個檢索的
所以考慮到這一點,是的多處理隊列維護順序。
我發現多個進程使用的隊列得到了一些非常意外的排序,即使 maxsize=1 在你期望它以串行方式運行的情況下也是如此。 官方文檔支持我的實驗:
如果多個進程正在排隊對象,則對象可能會在另一端無序接收。 但是,由同一進程排隊的對象將始終按預期順序排列。
但是通過使用管理器隊列,排序可以在多個進程中自行排序。 至少我一次從多個進程中對 manager.Queue(maxsize=1) 進行了大量試驗,並且始終保持順序。 再次,來自官方文檔:
如果 [后果] 真的困擾您,那么您可以改用由經理創建的隊列。
我發現多個進程使用的隊列得到了一些非常意外的排序,即使 maxsize=1 在你期望它以串行方式運行的情況下也是如此。 官方文檔支持我的實驗:
如果多個進程正在排隊對象,則對象可能會在另一端無序接收。 但是,由同一進程排隊的對象將始終按預期順序排列。
一旦訪問它的進程數量增加,我對管理器隊列也有同樣的問題。
從我的實驗中,我發現最好的管理方法是使用JoinableQueue
,然后在處理隊列 get 的代碼末尾手動調用task_done()
,尤其是在我的情況下,您正在處理兩個隊列以進行輸入和輸出。 即JoinableQueue1.get()
- 處理數據 - JoinableQueue2.put()
- 然后JoinableQueue1.task_done()
。 如果您使用JoinableQueue.join()
方法,您還可以更好地從許多進程使用的共享隊列中獲取 FIFO。
我有一個案例,我必須將所有multiprocessing.Queue
替換為m.Queue
其中m = multiprocess.Manager()
以便對所有隊列進行排序。 但是,我不能用一個簡單的例子來重現它。
我真的不知道為什么,但如果有人因為他們的隊列出現故障而來到這里,我建議嘗試這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.