利用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
猜你喜欢
- Python编写微信小游戏“跳一跳”的运行脚本,分享给大家。更新了微信后发现了一款小游戏跳一跳,但是玩了一下午最高才达到200,每次差点破纪
- 本文实例讲述了python获取Linux下文件版本信息、公司名和产品名的方法,分享给大家供大家参考。具体如下:区别于前文所述。本例是在lin
- 一、argparse介绍官方文档argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块,argparse 模块可以
- 描述sin()返回的x弧度的正弦值。语法以下是sin()方法的语法:importmath math.sin(x)注意:sin()是不能直接访
- 目录介绍:原理:1.标准import2.reload函数实现:总结:介绍:热更新,就是在服务器不重启的的情况下,对游戏增加新的功能或者修复出
- bytes 和 bytearraybytes 和 bytearray 都是二进制世界的成员,用二进制的方式去理解才能看清他的本质。理解byt
- 使用Python进行数据分析,大家都会多少学习一本经典教材《利用Python进行数据分析》,书中作者使用了Ipython的交互环境进行了书中
- XMLHttpRequest 最近在 W3C 标准之路上又迈进了一步,W3C Web API&nbs
- 本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法。分享给大家供大家参考,具体如下:两个要点:1、公历转农历用了查表法(第126
- 1、卓越亚马逊的首页轮换图片,每刷新一次,都是随机不同的顺序显示,这样的设计解决了对于较多图片轮换而靠后的图片信息很少被看到的问题,这点对于
- 基于python 3.5,python 2.7 与python3.4 的urllib不同,是urlparse>>> fro
- 如何限制上传文件的大小?要限制上传大小,只需如下设置一个属性即可: &
- 过去一段时间人们似乎又非常热衷于探讨网络文档的印刷格式,涌现了很多与之相关的技术与理论资料,其中相当重要的一个领域就是关于印刷中字号和行高的
- Thinkphp6的日志问题日志级别debug, info, notice, warning, error, critical, alert
- 一、TensorFlow模型保存和提取方法1. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提取。tf.t
- 快速测试创建项目与appdjango-admin startproject mysitedjango-admin startapp app1
- 不知道在坛子里有多少朋友使用触发器,如果你已经对触发器很了解了,那么请跳过此文,如果你还没有使用过触发器的话,那就让我们来认识一下吧。相关阅
- 第一种方法:递归def perms(elements): if len(elements) <=1
- 使用方法:terminal中输入python weather.py http://www.weather.com.cn/weather/10
- 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHO