请原谅我,如果这是显而易见的,但我无法从documentation告诉使用队列时的输出是否有序。也就是说,如果输入为# dictionary=sparams
# mydict = {}
# listKey = []
# listValue = []
# for line in dictionary.split("\n"):
# if not line.strip():
# continue
# k, v = [word.strip() for word in line.split("=")]
# mydict[k] = v
,则输出为[1, 2, 3]
,或者它们是否会出现故障?
编辑:我知道输入是在FIFO中处理的。但FIFO检索是否必然保证结果也按顺序返回?
答案 0 :(得分:4)
否,他们将按照完成的顺序进入队列,而不是按照开始的顺序进入队列。这意味着,如果您牢记特定顺序启动流程,则它们可能会或可能不会以该顺序完成。如果顺序对您很重要,则应将起始顺序与结果一起传递回队列,也许以元组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()
功能,该功能可以确保根据输入顺序保留输出顺序。
答案 1 :(得分:1)
答案 2 :(得分:0)
多处理队列永远不会出现故障。从文档中可以清楚地提到3种类型。 FIFO
,LIFO
和优先级队列(一种自定义顺序的方法)。默认顺序即。 class Queue.Queue
正在使用FIFO
在FIFO队列中,添加的第一个任务是第一个检索到的
因此,考虑到这一点,是多处理队列维持秩序。