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

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)
修改说明
  1. 调整print_waiting为永久循环逻辑,线程不会退出,仅在waiting为True时播放动画,为False时空转休眠,降低CPU占用
  2. 动画的每帧播放前都判断waiting状态,收到停止信号立刻终止动画播放
  3. 新增线程锁保证全局变量waiting的读写安全,避免多线程竞争导致的状态异常
  4. 触发main_process后自动删除触发文件,避免重复执行
  5. 调整线程为守护线程,主程序可以通过Ctrl+C正常终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 15:36:09