33731934 2024-02-15 15:44 采纳率: 62.5%
浏览 2
已结题

一个关于python多线程的问题

现有个问题,爬虫循环时,按ESC键可以直接退出,使用了keyboard.wait 方法,但是当子线程循环结束时,父线程还在那里等待键盘按键,怎么既能实现按键退出循环,又能当子线程完成时,退出整个程序,谢谢。

import threading
import time
import keyboard

def print_digital():
    for i in range(100):
        print(i)
        time.sleep(0.1)

t = threading.Thread(target=print_digital, daemon=True)
t.start()
keyboard.wait('esc')
print("程序退出")

  • 写回答

4条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-15 15:45
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    在Python中,要实现按ESC键退出整个程序,同时确保当子线程完成时也能正常退出,可以使用线程同步机制(如Event对象)以及主线程监听键盘中断。下面是一个修改后的示例:

    import threading
    import time
    import keyboard
    
    # 创建一个事件对象用于线程间通信
    stop_event = threading.Event()
    
    def print_digital(stop_event):
        for i in range(100):
            if stop_event.is_set():  # 检查停止事件是否被触发
                break
            print(i)
            time.sleep(0.1)
    
    t = threading.Thread(target=lambda: print_digital(stop_event), daemon=True)  # 将stop_event传入目标函数
    t.start()
    
    try:
        keyboard.wait('esc')
    except KeyboardInterrupt:  # 处理Ctrl+C等其他可能的中断信号
        pass
    
    # 当检测到ESC按键按下时,设置停止事件
    stop_event.set()  # 告诉子线程结束循环
    
    # 确保子线程有机会结束
    t.join()
    
    print("程序退出")
    

    这样,当用户按下ESC键时,主线程会通过设置stop_event来通知子线程终止循环,然后等待子线程结束(通过调用t.join()),最后程序才会完全退出。如果子线程先于ESC按键结束,那么主线程在调用keyboard.wait('esc')后也会自然地继续执行并退出程序。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 已采纳回答 2月15日
  • 创建了问题 2月15日

悬赏问题

  • ¥15 CATIA有些零件打开直接单机确定终止
  • ¥15 请问有会的吗,用MATLAB做
  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 ARIMA模型时间序列预测用pathon解决
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序,怎么查看客户esp32板子上程序及烧录地址