Python如何同时在两个输出行分别运行无限循环按指定间隔打印字符
Python实现两行独立并行滚动打印的方案
核心思路
单线程下两个无限while循环会互相阻塞,所以需要用多线程并行执行两个打印任务,同时通过ANSI转义序列控制终端光标位置,保证两个行的打印内容互不干扰。
完整实现代码
import threading import time import os # 适配Windows终端开启ANSI转义支持,Linux/macOS环境可删除该行 os.system('') # 分别记录两行已打印的字符数量 line1_char_cnt = 0 line2_char_cnt = 0 # 线程锁,避免多线程同时操作打印导致光标错位 print_lock = threading.Lock() def print_line1(): global line1_char_cnt while True: time.sleep(3) with print_lock: # 光标跳转到第一行当前末尾位置,打印* print(f"\033[1;{line1_char_cnt * 2 + 1}H*", end=" ", flush=True) line1_char_cnt += 1 # 光标复位到第二行末尾,不影响后续打印 print(f"\033[2;{line2_char_cnt * 2 + 1}H", end="", flush=True) def print_line2(): global line2_char_cnt while True: time.sleep(5) with print_lock: # 光标跳转到第二行当前末尾位置,打印$ print(f"\033[2;{line2_char_cnt * 2 + 1}H$", end=" ", flush=True) line2_char_cnt += 1 # 光标复位到第二行末尾 print(f"\033[2;{line2_char_cnt * 2 + 1}H", end="", flush=True) if __name__ == "__main__": # 先输出两行空内容占位,避免初始光标位置错误 print() print() # 启动两个打印守护线程 threading.Thread(target=print_line1, daemon=True).start() threading.Thread(target=print_line2, daemon=True).start() # 主线程保持运行,按Ctrl+C可终止程序 while True: time.sleep(1)
关键说明
- ANSI转义序列
\033[行号;列号H可以将终端光标定位到指定位置,终端行号、列号均从1开始计数,这里每个字符加空格占2位,所以列号按字符数*2计算 - 加线程锁是为了保证同一时间只有一个线程操作光标和打印,避免出现输出内容错位
flush=True强制刷新输出缓冲区,保证内容立刻显示到终端,不会等到缓冲区满或者换行才输出- 守护线程设置
daemon=True,可以保证主线程退出时两个打印线程自动销毁,不会残留后台进程
内容的提问来源于stack exchange,提问作者Mohammad Javad Alizadeh
相关产品推荐
相关产品推荐

