You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键细节说明

  1. ANSI终端控制:
    • \033[1;1H:强制将光标定位到终端第1行第1列,固定顶部消息的输出区域
    • \033[K:清除光标所在行的全部内容,避免旧消息残留干扰新内容
  2. 线程锁作用:
    • 用print_lock包裹所有打印操作,防止两个线程同时操作终端输出,避免混乱
  3. 输出区域分离:
    • 数字打印默认在下方新行输出,顶部消息始终固定在第一行,两者的输出区域完全独立

最终效果

运行后,终端第一行会循环切换Out Message 1和Out Message 2,下方从第二行开始依次打印数字,不会出现内容重叠的情况。

内容的提问来源于stack exchange,提问作者Michel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:30:49