在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能给出更好的订单..。但这仍然不是我想要的。我可以重写print函数,将其保存到一个变量中,然后立即打印它们--但我更愿意在它们完成时立即显示它们--而不是当它们全部完成时。
发布于 2015-06-28 13:16:30
如果一个Pool在工作进程(由操作系统调度)之间分配列表元素,那么您就无法用map保证输出顺序。
最好的方法(使用map)是将输入更改为元组(sequence_number, data)列表,让worker函数返回(sequence_number, result),而不是按sequence_number排序。
如果希望在项目完成后立即开始处理,请使用imap或imap_unordered。使用imap将保持与输入可迭代相同的顺序。如果对(sequence_number, result)元组和imap使用相同的技巧,则可以将结果保存在列表中,并在没有间隙的序列中打印出来。
发布于 2017-06-22 15:00:11
澄清- 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 order29https://stackoverflow.com/questions/31099729
复制相似问题