Abd*_*iJK 3 python pool multiprocessing 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))
Run Code Online (Sandbox Code Playgroud)
输出是: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
可以提供更好的订购......但它仍然不是我想要的.我可以覆盖打印功能,将其保存到一个变量中并立即打印出来 - 但我希望它们一完成就显示出来 - 而不是一切都完成.
鉴于a Pool
在工作进程(由操作系统调度)之间分配列表的元素,因此无法保证输出顺序map
.
你可以做的最好的(with map
)是将输入更改为元组列表(sequence_number, data)
,让工作函数返回(sequence_number, result)
而不是排序sequence_number
.
如果要在完成后立即开始处理项目,请使用imap
或imap_unordered
.使用imap
将保留与输入可迭代相同的顺序.如果你使用与(sequence_number, result)
元组相同的技巧imap
,你可以将结果保存在列表中,并在没有间隙的序列后打印它们.
澄清 - OP 正在寻求在流程完成后立即获得订单(而不是等待所有流程完成)。Map 确实保证输出顺序 - 但您需要等待所有进程完成。
这是另一个强调这一点的讨论 - 另一个堆栈讨论
这是编辑后的代码以及对像我这样可能感到困惑的人来说区分两者的结果。
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))`
Run Code Online (Sandbox Code Playgroud)
结果是:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4627 次 |
最近记录: |