利用Python实现定时程序的方法
作者:Lavender1 发布时间:2021-04-16 08:28:04
目录
定时器概念
实现一个简单的定时程序
方案一
方案二
定时器概念
什么是定时器呢?它是指从指定的时刻开始,经过一个指定时间,然后触发一个事件,用户可以自定义定时器的周期与频率。
实现一个简单的定时程序
方案一
在 Python 中,如何定义一个定时器函数呢?我们先看第一种方法。假设我们需要执行一个函数userCountFunc,这个函数需要每隔一个小时被执行一次。那么,我们可以这样写:
def main():
startCronTask(userCountFunc, minutes=60)
if __name__ == '__main__':
main()
如上面的代码,我们在定义了一个 main 函数后,便定义了一个定时函数 startCronTask。第一个参数为函数名,第二个参数为时间,第二个参数表示多长时间后调用后面第一个参数的函数。第一个参数注意是函数对象,进行参数传递,用函数名(如 userCountFunc)表示该对象,不是函数执行语句 userCountFunc(),不然会报错。那么,在实现这个函数时,需要引入定时功能,Python 中有一个定时任务模块 BlockingScheduler:
from apscheduler.schedulers.blocking import BlockingScheduler
def startCronTask(task, **config):
# BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(task, 'interval', **config)
scheduler.start()
定义完一个调度模块之后,实际的定时调度功能就完成了。接下来,需要具体实现定时执行的逻辑函数 userCountFunc:
def userCountFunc():
logger.info('count user')
...
这样,对于方案一,实现的简单的定时功能就完成了。
方案二
方案一中介绍的是 Python 自带的 BlockingScheduler 模块,Python 中除了可以通过 BlockingScheduler,还通过线程实现定时器 timer,来简单的看下代码:
import threading
def timerFunc():
print('Hello World~')
timer = threading.Timer(1, timerFunc)
timer.start()
在上面的代码中,定时器函数 threading.Timer 主要有2个参数,参数意义与方案一类似,接下来执行这段程序:
Hello World~
Process finished with exit code 0
我们发现只执行一遍,程序就结束了,但显然不是我们想要的结果。其实,我们看下 Time 类,有这样的一句解释性注释:Call a function after a specified number of seconds,我们发现上面在执行后并未循环执行,所以需要修改下:
import threading
def timerFunc():
print('Hello World~')
global timer
timer = threading.Timer(10.5, timerFunc)
timer.start()
timer = threading.Timer(3, timerFunc)
timer.start()
此时,我们可以看到输出结果:
Hello World~
Hello World~
Hello World~
...
这里需要注意的是:必须在定时器执行函数内部重复构造定时器,因为定时器构造后只执行1次,必须循环调用。
另外,在上面的代码中,我们其实还可以看到:threading.Timer(5.5, timerFunc),定时器间隔单位是秒,可以是浮点数,如5.5,0.9等,在执行函数 timerFunc 内部和外部中给的值可以不同。如上例中第一次执行 timerFunc 是3秒后,后面的都是10.5秒后执行。
接下来,我们再看看如何再一定时间结束定时功能。我们可以使用cancel停止定时器的工作,如下例:
import threading
def timerFunc():
print('Hello World~')
global timer
timer = threading.Timer(10.5, timerFunc)
timer.start()
timer = threading.Timer(3, timerFunc)
timer.start()
time.sleep(60)
timer.cancel()
上面的代码表示:在定时器按照一定时间执行后,执行过程耗时60秒后停止定时操作功能,退出。显示结果为:
Hello World~
Hello World~
Hello World~
Hello World~
Hello World~
...Process finished with exit code 0
来源:https://juejin.cn/post/6981328254523146248


猜你喜欢
- 比如:import linecacheprint linecache.getline('2.1_open.py&
- 看下面的例子, var btn = document.getElementById('mybtn'); btn.onclic
- win2000注册表程序 regedt32.exe下面是解决IIS出现Active Server Pages错误&
- 如下所示:import matplotlib.pyplot as pltimport numpy as npdef readfile(fil
- 如下所示:logging: config: classpath:spring-logback.xml pattern: console: &
- 问题你想根据一组语法规则解析文本并执行命令,或者构造一个代表输入的抽象语法树。 如果语法非常简单,你可以不去使用一些框架,而是自己写这个解析
- Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了
- 多线程编程当中, 线程的存在形态比较抽象. 通过前台线程\后台线程, 可以有效理解线程运行顺序.(复杂的多线程程序可以通过设置线程优先级实现
- Hpack 是啥Hpack 是 HTTP2 的头部压缩算法。在 HTTP1 中,每次传输都会有大量的 Header 携带,我们可以拿一个实际
- 在说这两兄弟前,先做一个实验:我在Win7下新建左一个文本文件test.txt,然后用记事本打开输入如下内容,保存然后用UltraEdit以
- flash param参数和属性下列标记属性和参数描述了由“发布”命令创建的 HTML 代码。在编写自己的用于显示 Flash 内容的 HT
- 很久之前,分享过一次Python代码实现验证码识别的办法。当时采用的是pillow+pytesseract,优点是免费,较为易用。但其识别精
- 本文实例讲述了mysql中left join设置条件在on与where时的用法区别。分享给大家供大家参考,具体如下:一、首先我们准备两张表来
- 方法说明: 同步版的fs.writeFile() 。语法:fs.writeFileSync(filename, data, [o
- 目录MySQL约束操作1.非空约束2.唯一约束3.主键约束4.外键约束5、级联MySQL约束操作概念:对表中的数据进行限定,保证数据的正确性
- 图像的阈值处理一般使得图像的像素值更单一、图像更简单。阈值可以分为全局性质的阈值,也可以分为局部性质的阈值,可以是单阈值的也可以是多阈值的。
- 详细介绍Scrapy shell的使用Scrapy shell是Scrapy框架提供的一个非常有用的工具,可以帮助开发者快速地测试和调试Sc
- 1.排序示例表内容见此篇文章Mysql支持数据排序操作,例如,现在我们按照工资从小到大进行排序操作:mysql> select ena
- 如何让我的网页自动适应客户端的屏幕分辨率?然后用下列办法进行自动推送:<% @language="vbscript
- 在处理数据的时候,因为没有及时的去重,所以需要重新对生成txt进行去重。可是一个文件夹下有很多txt,总不可能一个一个去操作,这样效率太低了