在多重处理技术中,我试图以同样的顺序显示我的打印。
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函数,将其保存到一个变量中,然后一次打印所有内容--但我更希望在它们完成时立即显示它们--而不是在所有内容完成时显示。
2条答案
按热度按时间jtoj6r0c1#
假定
Pool
在工作进程(由操作系统调度)之间分配列表的元素,那么您无法用map
来 * 保证 * 内部处理顺序。对于
map
,最好的办法是将输入更改为元组(sequence_number, data)
的列表,让辅助函数返回(sequence_number, result)
,然后按sequence_number
排序。如果你想在项目完成后立即开始处理,可以使用
imap
或imap_unordered
。使用imap
将保持与输入可迭代项相同的顺序。如果你对imap
的(sequence_number, result)
元组使用相同的技巧,你可以将结果保存在列表中,并在你得到一个没有间隔的序列后打印它们。j8ag8udp2#
澄清- OP寻求在一个过程完成时获得顺序(而不是等待所有过程完成)。Map确实保证了输出顺序-但你需要等待所有过程完成。
下面是另一个强调这一点的讨论-Another Stack Discussion
下面是编辑后的代码和结果,对于像我这样可能会感到困惑的人来说,这两者是有区别的。
结果如下: