簡體   English   中英

Python 多處理隊列是否有序?

[英]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()函數,它確實保證根據輸入順序保留輸出順序。

隊列

在 FIFO 隊列中,添加的第一個任務是第一個檢索的

class Queue.Queue(maxsize=0) FIFO 隊列的構造函數

是的,多處理隊列是 FIFO(先進先出)。

多處理隊列從來沒有亂序。 從文檔中它清楚地提到了 3 種類型。 FIFOLIFO和優先隊列(一種自定義順序的方法)。 默認順序即。 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.

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