我对其中包含多个print()
指标的某些任务使用多处理,因此我可以看到该进程如何在cmd中开始/工作/结束。但是,有些任务更快/更慢,因此print()
顺序是混乱的。我需要找到一种方法,在流程结束时一次显示所有print()
。
简化示例:
from multiprocessing import Process
from time import sleep
def runner(px_id):
print('Start'+str(px_id))
if px_id > 1:
sleep(2)
elif px_id == 1:
sleep(5)
print('Middle'+str(px_id))
if px_id > 1:
sleep(2)
elif px_id == 1:
sleep(5)
print('End'+str(px_id))
if __name__ == '__main__':
px_list = [1, 2, 3]
for px in px_list:
p = Process(target=runner, args=(px,))
p.start()
如果我现在运行此代码,我会收到:
Start1
Start2
Start3
Middle2
Middle3
End2
End3
Middle1
End1
虽然我需要这样的东西:
Start2
Middle2
End2
Start3
Middle3
End3
Start1
Middle1
End1
我仍然需要进程异步(因此不能使用join()
),而是在进程结束时打印所有print()。感谢任何建议:)
UPD:使用数组缓冲功能消息是一个很好的解决方案,仍需要一些缓冲外部函数解决方案的帮助。我的意思是,如果我在其他函数中使用某些函数,我无法手动缓冲所有print()
,所以寻找一些更复杂的解决方案:)
答案 0 :(得分:1)
一个选项是让每个实例缓冲内部缓冲区中的输出。然后在最后输出它。您可以让主线程继续并将每个已启动的进程保存在数组中。然后等待所有三个完成,最后从阵列中的每个进程中获取内部缓冲区并连续打印。