Python如何实现互不重叠的并行多打印块?
解决多线程打印内容重叠的问题
问题核心是\r仅能将光标移回当前行首,当另一个线程打印新行后,更新消息的线程会在数字行的行首覆盖内容,导致重叠。要实现顶部固定更新、下方打印数字的效果,需借助ANSI终端控制序列精准控制光标位置,同时用线程锁避免输出竞争。
修改后的代码
import time import threading # 线程锁,确保打印操作的原子性 print_lock = threading.Lock() def change_msg(): while True: with print_lock: # 移动光标到第1行第1列 print("\033[1;1H", end='') # 清除当前行所有内容 print("\033[K", end='') print("Out Message 1", end='', flush=True) time.sleep(1) with print_lock: print("\033[1;1H", end='') print("\033[K", end='') print("Out Message 2", end='', flush=True) time.sleep(1) def print_numbers(): with print_lock: # 初始化输出位置,让数字从第2行开始 print("\nStarting numbers...") for i in range(5): time.sleep(5) with print_lock: print(f"Number {i+1}") with print_lock: print("Finishing numbers...") if __name__ == "__main__": thread_1 = threading.Thread(target=change_msg, daemon=True) thread_2 = threading.Thread(target=print_numbers) thread_1.start() thread_2.start() thread_2.join()
关键细节说明
- ANSI终端控制:
\033[1;1H:强制将光标定位到终端第1行第1列,固定顶部消息的输出区域\033[K:清除光标所在行的全部内容,避免旧消息残留干扰新内容
- 线程锁作用:
- 用
print_lock包裹所有打印操作,防止两个线程同时操作终端输出,避免混乱
- 用
- 输出区域分离:
- 数字打印默认在下方新行输出,顶部消息始终固定在第一行,两者的输出区域完全独立
最终效果
运行后,终端第一行会循环切换Out Message 1和Out Message 2,下方从第二行开始依次打印数字,不会出现内容重叠的情况。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

