python multiprocess.pool在标准输出中按顺序显示结果

bq9c1y66  于 2023-02-07  发布在  Python
关注(0)|答案(2)|浏览(130)

在多重处理技术中,我试图以同样的顺序显示我的打印。

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可以提供更好的排序......但它仍然不是我想要的。我可以重写print函数,将其保存到一个变量中,然后一次打印所有内容--但我更希望在它们完成时立即显示它们--而不是在所有内容完成时显示。

jtoj6r0c

jtoj6r0c1#

假定Pool在工作进程(由操作系统调度)之间分配列表的元素,那么您无法用map来 * 保证 * 内部处理顺序。
对于map,最好的办法是将输入更改为元组(sequence_number, data)的列表,让辅助函数返回(sequence_number, result),然后按sequence_number排序。
如果你想在项目完成后立即开始处理,可以使用imapimap_unordered。使用imap将保持与输入可迭代项相同的顺序。如果你对imap(sequence_number, result)元组使用相同的技巧,你可以将结果保存在列表中,并在你得到一个没有间隔的序列后打印它们。

j8ag8udp

j8ag8udp2#

澄清- 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

相关问题