利用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,定时程序
0
投稿

猜你喜欢

  • Windows 64位下python3安装nltk模块

    2023-11-20 09:42:12
  • 段正淳的css笔记(7)-表单在各浏览器的表现统一

    2008-01-14 02:47:00
  • javascript中parseInt()函数的定义和用法分析

    2024-04-22 22:44:16
  • 原生 JS Ajax,GET和POST 请求实例代码

    2024-04-16 08:54:28
  • python 生成目录树及显示文件大小的代码

    2022-10-24 18:30:27
  • Python中flatten( )函数及函数用法详解

    2023-11-28 04:09:47
  • JS清除IE浏览器缓存的方法

    2024-04-19 10:15:25
  • echo(),print(),print_r()之间的区别?

    2023-11-15 08:52:42
  • 一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)

    2023-07-02 17:00:47
  • python 判断文件或文件夹是否存在

    2021-06-30 05:56:55
  • Django中的FBV和CBV用法详解

    2023-09-15 10:41:06
  • python删除某个目录文件夹的方法

    2022-08-22 06:33:32
  • 基于python实现MQTT发布订阅过程原理解析

    2023-05-06 14:45:14
  • 在IE下获取object(ActiveX)的Param

    2009-05-15 13:07:00
  • Python读取配置文件(config.ini)以及写入配置文件

    2021-01-28 14:02:39
  • Python生成指定数量的优惠码实操内容

    2021-06-12 18:29:25
  • 超实用的 30 段 Python 案例

    2021-11-08 22:51:26
  • 如何在Python函数执行前后增加额外的行为

    2023-05-27 17:35:20
  • 一文教你快速生成MySQL数据库关系图

    2024-01-26 15:06:52
  • Django 返回json数据的实现示例

    2021-03-06 21:33:17
  • asp之家 网络编程 m.aspxhome.com