python multiprocess.Pool在stdout中按顺序显示结果

时间:2015-06-28 12:21:21

标签: python multiprocessing pool python-multiprocessing

在multiprocessing.Pool中我试图以相同的顺序显示我的打印件。

from multiprocessing import Pool
import time
def func(arg):
    time.sleep(0.001)
    print(arg, end=" ")

proc_pool = Pool(4)
proc_pool.map(func, range(30))

输出为:0 1 8 9 10 11 14 15 6 7 16 17 4 5 12 13 18 19 2 3或类似。它不是0 1 2 3 ...

的顺序

我知道imap可以提供更好的排序......但它仍然不是我想要的。我可以覆盖打印功能,将其保存到一个变量中并立即打印出来 - 但我希望它们一完成就显示出来 - 而不是一切都完成。

2 个答案:

答案 0 :(得分:5)

鉴于Pool在工作进程(由操作系统调度)之间分配列表的元素,因此无法使用{保证输出顺序{ {1}}。

您可以做的最好(使用map)将输入更改为元组map列表,让工作函数返回(sequence_number, data),然后按{{1}排序}。

如果您想在完成后立即开始处理项目,请使用(sequence_number, result)sequence_number。使用imap将保留与输入iterable相同的顺序。如果您使用imap_unordered元组与imap使用相同的技巧,则可以将结果保存在列表中,并在序列无间隙时打印它们。

答案 1 :(得分:3)

澄清 - OP正在寻求在流程完成后立即获得订单(而不是等待所有流程完成)。 Map确保输出顺序 - 但您需要等待所有进程完成。

这是另一个强调这一点的讨论 - Another Stack Discussion

以下是编辑过的代码以及两者之间的区别结果,对于像我这样可能会感到困惑的人来说。

from multiprocessing import Pool
import time


def func(arg):
   time.sleep(0.001)
   print("process order: "+str(arg))
   return arg
if __name__=='__main__':
   proc_pool = Pool(4)
   results = proc_pool.map(func, range(30))
   proc_pool.close()
   proc_pool.join()

   for a in results:
      print("output order"+str(a))` 

结果是:

process order: 6
process order: 7
process order: 14

output order0
output order1
output order2
output order3
output order4
output order5
output order6
output order7
output order8
output order9
output order10
output order11
output order12
output order13
output order14
output order15
output order16
output order17
output order18
output order19
output order20
output order21
output order22
output order23
output order24
output order25
output order26
output order27
output order28
output order29