Python的线程19 拖延症患者Timer类

Posted 雷学委

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的线程19 拖延症患者Timer类相关的知识,希望对你有一定的参考价值。

正式的Python专栏第56篇,同学站住,别错过这个从0开始的文章!

多线程这一块写了快要20篇了,这篇来一个轻松一点点的。

我们来学习一下Timer类,这个类很简单,但是很特别。

每到新年,大家就会进行总结,跟之前立的flag进行自我复盘。

Timer就是类似一个可以帮助你在立flag之后,到时间告诉你,该进行复盘了。

什么是Timer

准确点说,它是一个延迟执行的事件的单元(threading模块下的一个类),用来在指定时间后执行该事件。

使用上非常简单:

def do_something_after_new_year():
    #新年不🉐️事事顺利,万事如意
    pass
   
#Timer类,传入一个时间(秒数),第二个参数为到点执行的函数。
threading.Timer(60,do_something_after_new_year).start()

这样就设置了一个60秒后执行的程序了。 类似时间管理器,设置多少时间后干嘛

下面就是一个完整可执行的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/1/27 11:16 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : timer_demo.py
# @Project : hello
import datetime
import threading


def do_after_5_second():
    print("%s - thread %s " % (datetime.datetime.now(), threading.current_thread().name))
    print("do something now ")


print("%s - thread %s " % (datetime.datetime.now(), threading.current_thread().name))
threading.Timer(5, do_after_5_second).start()

运行效果如下:

为了演示方便,这里就设置了等待间隔为5秒,程序很快就结束输出了。

在timer执行的函数中,它是另起一个线程。

Timer 还可以中途取消

我们查看源码可以看到:

这个类也没别的,还有一个cancel的方法。

那么,学委也准备了代码,展示一下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/1/27 11:16 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : timer_demo2.py
# @Project : hello
import datetime
import threading


def do_after_5_second():
    print("%s - thread %s " % (datetime.datetime.now(), threading.current_thread().name))
    print("do something now ")


def do_after_1_min():
    print("%s - thread %s " % (datetime.datetime.now(), threading.current_thread().name))
    print("do_after_1_min ")


def stop_another_timer(timer):
    print("%s - thread %s " % (datetime.datetime.now(), threading.current_thread().name))
    print("I will cancel another time")
    print("before cancel - timer :", timer.is_alive())
    timer.cancel()
    print("after cancel - timer :", timer.is_alive())


print("%s - thread %s order a timer" % (datetime.datetime.now(), threading.current_thread().name))
threading.Timer(5, do_after_5_second).start()
print("%s - thread %s order another timer " % (datetime.datetime.now(), threading.current_thread().name))
timer = threading.Timer(60, do_after_1_min)
timer.start()
print("%s - thread %s order another timer " % (datetime.datetime.now(), threading.current_thread().name))
#读者可以注释下方代码,查看前面timer没被中途取消的执行结果。
threading.Timer(10, lambda: stop_another_timer(timer)).start()

下面是运行效果:

我们看到,cancel方法不会把线程的状态(通过is_alive()查看)改变。因为cancel方法改变的是Timer类维护的finished(Event类型,这个学委的另一篇文章也分享过)

最后等候时长的timer被取消了,没有后续执行,程序也就结束了。

总结

很明显,Timer就是一个拖延症患者啊,干啥事都得拖一拖。

希望读者朋友们,别拖延,学习了东西马上学会,马上吸收内化,加油!

喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!

以上是关于Python的线程19 拖延症患者Timer类的主要内容,如果未能解决你的问题,请参考以下文章

Python的线程19 拖延症患者Timer类

TED 你有拖延症吗? Tim Urban

为什么时间越紧,越容易拖延?--致拖延症患者

Tim Urban:你有拖延症吗?

拖延症重症患者。。的自察

一位拖延症患者程序员的自我救赎!