Python多线程实现:如何通过一个线程控制等待动画线程的启停
问题根因
你的代码达不到预期有4个核心问题:
- 打印等待动画的线程
print_waiting会在waiting变为False后直接退出,后续将waiting改回True时没有运行的线程负责打印动画 - 动画的for循环没有实时判断
waiting状态,就算停止信号发出,也要等当前轮次的所有动画符号全部播放完才会停止 - 没有删除触发文件,会导致
main_process运行结束后立刻被重复触发 - 多线程读写全局变量
waiting没有加锁,存在线程安全风险
修复后可运行代码
import os import time import threading waiting = True trigger_file = r'D:\Desktop\OK' lock = threading.Lock() # 加锁保证全局变量读写安全 def main_process(): print('1') time.sleep(5) print('2') time.sleep(5) print('3') time.sleep(5) print('4') time.sleep(5) print('5') def print_waiting(): # 等待动画逻辑 while True: # 线程永久运行不退出 with lock: current_waiting = waiting if current_waiting: for loading_symbol in ['|','/','-','\\','|','/','-','\\','|']: # 每次打印前都判断是否需要停止动画 with lock: if not waiting: break print('\r[INFO] Waiting for trigger... '+loading_symbol,end="") time.sleep(0.2) else: # 非等待状态休眠降低CPU占用 time.sleep(0.1) def triggerListener(): # 触发监听逻辑 while True: if os.path.exists(trigger_file): # 更新waiting状态前加锁 with lock: global waiting waiting = False print('\n[INFO] main process start') # 删除触发文件避免重复执行 os.remove(trigger_file) main_process() # 执行完成后恢复等待状态 with lock: waiting = True # 降低文件检测频率减少CPU占用 time.sleep(0.5) if __name__ == "__main__": # 将两个线程设为守护线程,主程序退出时自动结束 t1 = threading.Thread(target=print_waiting, daemon=True) t2 = threading.Thread(target=triggerListener, daemon=True) t1.start() t2.start() # 阻塞主程序不退出,可通过Ctrl+C终止程序 while True: time.sleep(1)
修改说明
- 调整
print_waiting为永久循环逻辑,线程不会退出,仅在waiting为True时播放动画,为False时空转休眠,降低CPU占用 - 动画的每帧播放前都判断
waiting状态,收到停止信号立刻终止动画播放 - 新增线程锁保证全局变量
waiting的读写安全,避免多线程竞争导致的状态异常 - 触发
main_process后自动删除触发文件,避免重复执行 - 调整线程为守护线程,主程序可以通过Ctrl+C正常终止
内容的提问来源于stack exchange,提问作者AlexMoshi
相关产品推荐
相关产品推荐

