Python多处理队列是否已订购?

时间:2018-04-16 13:50:53

标签: python multiprocessing python-multiprocessing

请原谅我,如果这是显而易见的,但我无法从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检索是否必然保证结果也按顺序返回?

3 个答案:

答案 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)

Queue

  

在FIFO队列中,添加的第一个任务是第一个检索到的

     

class Queue.Queue(maxsize = 0)FIFO队列的构造函数

是的,多处理队列是FIFO(先进先出)。

答案 2 :(得分:0)

多处理队列永远不会出现故障。从文档中可以清楚地提到3种类型。 FIFOLIFO和优先级队列(一种自定义顺序的方法)。默认顺序即。 class Queue.Queue正在使用FIFO

  

在FIFO队列中,添加的第一个任务是第一个检索到的

因此,考虑到这一点,是多处理队列维持秩序。