如果这很显然,请原谅我,但从文档中我无法确定在使用队列时输出是否有序。也就是说,如果输入是[1, 2, 3]
,那么输出会是f(1)、f(2)、f(3)
,还是可能是无序的?
编辑:我知道输入按照先进先出(FIFO)的方式处理。但是,FIFO检索是否必然保证结果也以有序的方式返回?
如果这很显然,请原谅我,但从文档中我无法确定在使用队列时输出是否有序。也就是说,如果输入是[1, 2, 3]
,那么输出会是f(1)、f(2)、f(3)
,还是可能是无序的?
编辑:我知道输入按照先进先出(FIFO)的方式处理。但是,FIFO检索是否必然保证结果也以有序的方式返回?
queue.put((order, result))
。下面是一个示例,显示您从队列中得到的随机顺序(仍然是FIFO)。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()
函数,该函数可以保证输出顺序与输入顺序相同。
我有一个问题需要把所有的 multiprocessing.Queue
替换成 m.Queue
,其中 m = multiprocess.Manager()
,这样所有的队列都会被排序。然而,我无法通过简单的示例进行复现。
我不太清楚原因,但如果有人因为他们的队列无序而来到这里,我建议尝试一下这个方法。
多进程队列从未失序。文档中明确提到了三种类型:FIFO
,LIFO
和优先级队列(一种自定义顺序的方式)。默认顺序即 class Queue.Queue
使用 FIFO
。
在FIFO队列中,添加的第一个任务是第一个被检索到的。
因此,考虑到这一点,是的,多进程队列维护顺序。