Python multiprocessing:如何优化进程打印,实现整洁实时输出?
解决多进程进度输出混乱的问题
要实现控制台最多显示3行内容且各进程进度原地更新,核心思路是利用ANSI终端转义序列控制光标位置,让每个进程的输出固定在专属行,避免换行导致的混乱。
实现代码
import multiprocessing import time import sys def foo(process_num): # 每个进程对应固定行,process_num为0/1/2,对应第1/2/3行 for progress in range(101): # 光标定位到当前进程的目标行:先回到左上角,再向下移动指定行数 sys.stdout.write(f"\033[H\033[{process_num+1}B") # 回车到行首,覆盖原有内容实现原地更新 sys.stdout.write(f"\r进程{process_num+1} 进度: {progress}%") # 强制刷新缓冲区,确保内容实时显示 sys.stdout.flush() time.sleep(0.05) if __name__ == "__main__": # 先打印3个空行预留位置,确保控制台始终最多显示这3行进度 print("\n" * 3) # 光标回到控制台左上角,准备接受进程输出 sys.stdout.write("\033[H") sys.stdout.flush() # 启动3个进程,传递各自的行标识 processes = [multiprocessing.Process(target=foo, args=(i,)) for i in range(3)] for p in processes: p.start() # 等待所有进程完成 for p in processes: p.join() # 所有进程结束后,光标移到进度行下方,输出完成提示 sys.stdout.write("\033[H\033[4B\n") sys.stdout.write("所有进程执行完成!\n")
关键细节说明
\033[H:将光标直接移动到控制台左上角(第1行第1列)\033[{n}B:将光标向下移动n行,确保每个进程的输出固定在专属行\r:回车到当前行的开头,覆盖原有内容,实现进度的原地更新sys.stdout.flush():强制刷新输出缓冲区,避免因缓冲区积压导致的内容延迟显示
这种方式严格控制了输出位置,既能保证控制台始终只显示3行进度内容,又能让每个进程的进度百分比在原地实时更新,彻底解决输出混乱的问题。
内容的提问来源于stack exchange,提问作者skillshot
相关产品推荐
相关产品推荐

