定时功能

简介: 利用Py简单实现定时功能

定时概念

什么是定时呢?它是指从指定的时刻开始,经过一个指定时间,然后触发一个事件,用户可以自定义定时器的周期与频率。

书写一个简单定时任务

方案一

在 Python 中,如何定义一个定时器函数呢?我们先看第一种方法。假设我们需要执行一个函数userCountFunc,这个函数需要每隔一个小时被执行一次。那么,我们可以这样写:

def main():
    startTask(userCountFunc, minutes=60)

if __name__ == '__main__':
    main()

如上面的代码,我们在定义了一个 main 函数后,便定义了一个定时函数 startTask。第一个参数为函数名,第二个参数为时间,第二个参数表示多长时间后调用后面第一个参数的函数。第一个参数注意是函数对象,进行参数传递,用函数名(如 userCountFunc)表示该对象,不是函数执行语句 userCountFunc(),不然会报错。那么,在实现这个函数时,需要引入定时功能,Python 中有一个定时任务模块 BlockingScheduler:

from apscheduler.schedulers.blocking import BlockingScheduler

def startTask(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~
...

这里需要注意的是:必须在定时器执行函数内部重复构造定时器,因为定时器构造后只执行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~
...

Process finished with exit code 0
相关文章
|
4月前
|
弹性计算 安全 机器人
一键搞定定时自动化通知
您是否经常忘了需要每周要填报工作时长?您的团队是否需要每月定时盘点HC?您是否每月末都在工作群提醒大家更新OKR? 这些简单的定时任务是不是经常会忘记或者占用您的精力?如果你也有这些烦恼,是时候来试试这个应用与数据集成平台——阿里云计算巢AppFlow了,它能够像一个神经中枢,高效地串联起所有关键数据流,并且能够巧妙地运用现代化的通讯工具如钉钉群机器人,实现定时消息通知,让每一个重要信息都能准时送达,不再因为简单重复的定时工作而占用您的时间和精力~
212 0
|
4月前
|
Linux API 开发者
调用GrayLog的RestAPI接口实现定时关闭和定时开启告警
调用GrayLog的RestAPI接口实现定时关闭和定时开启告警
113 0
|
18天前
|
Python
定时提醒程序
【9月更文挑战第10天】
39 9
|
2月前
|
监控 Java 调度
若依修改定时任务,定时任务在系统监控的定时任务当中,宕机情况都不会去管,涉及到定时任务
若依修改定时任务,定时任务在系统监控的定时任务当中,宕机情况都不会去管,涉及到定时任务
|
4月前
|
异构计算
zTasker v1.88.1一键定时自动化任务
zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具,支持win7-11。其支持超过100种任务类型,50+种定时/条件执行方法,而且任务列表可以随意编辑、排列、移动、更改类型,支持任务执行日志,可覆盖win自带的热键,同时支持任务列表等数据的备份及自动更新等。
94 3
|
负载均衡 Java 数据挖掘
定时任务实现的几种方式
定时任务实现的几种方式
274 1
|
消息中间件 算法 Java
|
资源调度 运维 Java
定时任务报警通知解决方案详解
随着微服务和云计算的兴起,定时任务技术也是发展迅速,不仅能做单机的定时任务,而且在分布式系统下应用也很广泛,成为了业务做兜底、数据处理的第一选择。
2495 3
定时任务报警通知解决方案详解
|
测试技术
自动定时发送每日构建测试报告
自动定时发送每日构建测试报告
149 1