python中断time.sleep一种更优雅的方式:event.wait

 更新时间:2023年11月10日 09:00:10   作者:Rnan-prince  
这篇文章主要介绍了python中断time.sleep一种更优雅的方式:event.wait,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

场景描述

实现一个功能,启动一个线程,只要线程不中断,就一直while true,间断10s累加某个数;

当线程线程信号时,while停止,线程退出。

1、方法一 time.sleep

import time
from threading import Thread
 
 
class AddTask(Thread):
 
    def __init__(self):
        super().__init__()
        self.sum_num = 0
        self._button = True
 
    def run(self):
        print('Begin to add ...')
        while self._button:
            print('Sleep start...')
            time.sleep(10)
            print('Sleep end...')
            self.sum_num += 10
        print(f"Finish add, sum:{self.sum_num}...")
 
    def stop(self):
        print('Stop task...')
        self._button = False
 
 
def do_main_task():
    print('Do main task...')
    time.sleep(15)
    print('Finish main task...')
    return True
 
 
if __name__ == '__main__':
    add_task = AddTask()
    add_task.start()
    main_task_end = do_main_task()
    if main_task_end:
        add_task.stop()
        time.sleep(1)
        print(f"sum: {add_task.sum_num}")

执行结果:

Begin to add ...Do main task...
Sleep start...
Sleep end...
Sleep start...
Finish main task...
Stop task...
sum: 10
Sleep end...
Finish add,sum: 20...

解释一下这段代码的意思。在主线程里面,我调用do_main_task()触发了一个任务。这个任务执行会久一些(这里设定15s)。但是这个任务完成以后,会有个返回值,告诉我完成了。另外创建一个 add_task 子线程,每10秒累加10。

但某些情况下,我不需要等待了,例如用户主动取消了任务。这个时候,我就想提前结束这个 add_task 子线程。

通过执行结果可以看出,当执行一次+10,等待10s后,又过了5秒,主线程do_main_task结束了,这时add_task线程还在累加的sleep(10)中没有退出。主线程执行结果已经是sum=10,再过5秒后add_task线程才结束。

但是,线程是不能从外面主动杀死的,只能让它自己退出。

2、方法二 event.wait

应用threading模块里面的Event

用法和sleep差不多:

import threading
 
event = threading.Event()
event.wait(5)

上述例子可以这样实现:

import time
from threading import Thread
from threading import Event
 
 
class AddTask(Thread):
 
    def __init__(self):
        super().__init__()
        self.sum_num = 0
        self.event = Event()
 
    def run(self):
        print('Begin to add ...')
        while not self.event.is_set():
            print('Sleep start...')
            self.event.wait(10)
            print('Sleep end...')
            self.sum_num += 10
        print(f"Finish add, sum:{self.sum_num}...")
 
    def stop(self):
        print('Stop task...')
        self.event.set()
 
 
def do_main_task():
    print('Do main task...')
    time.sleep(15)
    print('Finish main task...')
    return True
 
 
if __name__ == '__main__':
    add_task = AddTask()
    add_task.start()
    main_task_end = do_main_task()
    if main_task_end:
        add_task.stop()
        time.sleep(1)
        print(f"sum: {add_task.sum_num}")

执行结果:

Do main task...
Begin to add ...
Sleep start...
Sleep end...
Sleep start...
Finish main task...
Stop task...
Sleep end...
Finish add, sum:20...

sum: 20

当执行event.set()后,子线程里面self.event.is_set()就会返回 False,于是这个循环就不会继续执行了。

即使self.event.wait(10)刚刚开始阻塞,只要我在主线程中执行了event.set(),子线程里面的阻塞立刻就会结束。

于是子线程立刻就会结束。不需要再白白等待10秒。

并且,event.wait()这个函数在底层是使用 C 语言实现的,不受 GIL 锁的干扰。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 非常详细的Django连接mysql数据库步骤记录

    非常详细的Django连接mysql数据库步骤记录

    我的Mysql中已经有了项目需要使用的相关数据库,现在需要通过django来获取Mysql里的数据并使用,下面这篇文章主要给大家介绍了关于非常详细的Django连接mysql数据库步骤,需要的朋友可以参考下
    2022-10-10
  • 手把手教你利用opencv实现人脸识别功能(附源码+文档)

    手把手教你利用opencv实现人脸识别功能(附源码+文档)

    最近搞一个人脸识别的项目练练手,不得不感叹opencv做人脸检测实在是强,这篇文章主要给大家介绍了关于利用opencv实现人脸识别功能的相关资料,并附上了源码以及文档,需要的朋友可以参考下
    2021-09-09
  • 五个Python命令使用的小妙招分享

    五个Python命令使用的小妙招分享

    平常在使用python命令过程中,基本上都是用来安装python库时才使用到在控制台的python命令。然而,python命令还有更多的妙用,本文就来为大家详细讲讲
    2022-07-07
  • Python使用matplotlib绘图无法显示中文问题的解决方法

    Python使用matplotlib绘图无法显示中文问题的解决方法

    这篇文章主要介绍了Python使用matplotlib绘图无法显示中文问题的解决方法,结合具体实例形式分析了Python使用matplotlib绘图时出现中文乱码的原因与相关解决方法,需要的朋友可以参考下
    2018-03-03
  • Python中关于文件的具体操作与介绍

    Python中关于文件的具体操作与介绍

    文件与目录操作是编程语言中非常重要的功能,Python也对其提供了相应的API支持,这篇博文就是具体介绍它们的使用方法,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • python在ubuntu中的几种安装方法(小结)

    python在ubuntu中的几种安装方法(小结)

    本篇文章主要介绍了python在ubuntu中的几种安装方法(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 详解在OpenCV中实现的图像标注技术

    详解在OpenCV中实现的图像标注技术

    图像标注在计算机视觉中很重要,计算机视觉是一种技术,它允许计算机从数字图像或视频中获得高水平的理解力,并以人类的方式观察和解释视觉信息,本文将重点讨论在OpenCV的帮助下创建这些注释,感兴趣的朋友一起看看吧
    2022-06-06
  • Python使用smtp和pop简单收发邮件完整实例

    Python使用smtp和pop简单收发邮件完整实例

    这篇文章主要介绍了Python使用smtp和pop简单收发邮件完整实例,简单介绍了smtp和pop,然后分享了相关实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • pygame加载中文名mp3文件出现error

    pygame加载中文名mp3文件出现error

    本文主要介绍了pygame加载中文名mp3文件出现error的解决方案。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • python 实现倒计时功能(gui界面)

    python 实现倒计时功能(gui界面)

    这篇文章主要介绍了python 实现倒计时功能(gui界面),帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11

最新评论