Python 多处理队列是有序的吗?

Tek*_*lia 4 python multiprocessing python-multiprocessing

如果这很明显,请原谅我,但我无法从文档中判断使用队列时的输出是否是有序的。也就是说,如果输入 是 ,[1, 2, 3]输出将是f(1), f(2), f(3),或者它们可能是无序的?

编辑:我知道输入是在 FIFO 中处理的。但先进先出检索就一定能保证结果也按顺序返回吗?

ozy*_*ias 10

不,他们将按照完成的顺序进入队列,而不是按照开始的顺序。这意味着,如果您按照特定顺序开始流程,它们可能会或可能不会按该顺序完成。如果顺序对您很重要,您应该将起始顺序与队列中的结果一起传回,也许作为 tuple 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)
Run Code Online (Sandbox Code Playgroud)

这给了我 [25, 16, 9, 0, 36, 64, 81, 1, 49, 4]。

假设您的任务相当简单,我总是更喜欢使用 Python 的Pool功能及其相应的pool.map()函数,这确实保证根据输入顺序保留输出顺序。