Python实现定时器

来自CloudWiki
27.201.193.198讨论2020年8月6日 (四) 15:36的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

Python实现定时器

在Linux下的任务调度分为两类:系统任务调度、用户任务调度

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。etc/crontab文件,系统任务调度的配置文件。 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。


无限循环执行法:设定相隔时间重复执行

#coding:utf-8   #编码格式为utf8
import threading    #导入threading模块
def sayhello():      #创建函数
       print("hello world")  #打印helloworld
       global t
       t = threading.Timer(2.0,sayhello)
       t.start()
t = threading.Timer(2.0,sayhello)  #相隔两秒
t.start()

解析:我们使用的threading 模块去实现,所以我们导入了这个模块。然后我们简 单的去定义了一个sayhello的方法。同时定义了一个全局变量为t,用来实现threa ding模块的时间间隔。(如果不使用global 这个关键字的话会造成线程堆积最终程序 退出)


延迟调用实现倒数计时器

#coding:utf8
import threading
def abc(): 
      print("这是abc的方法")
timer = threading.Timer(5,abc)
timer.start()

用threading模块去实现,通过延迟调用来实现倒数。


APScheduler模块实现定时器

Python的apscheduler提供了非常丰富而且方便易用的定时任务接口。apscheduler使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,我们可以 在主程序的运行过程中快速增加新作业或删除旧作业,如果把作业存储在数据库中,那么作业的状态会被保存,当调度器重启时,不必重新添加作业,作业会恢复原状态继续执行。

apscheduler可以当作-一个跨平台的调度工 具来使用,可以作为linux系统crontab工具或windows计划任务程序的替换。注意,apscheduler 不是一个守护进程或服务, 它自身不带有任何命令行工具。它主要是要在现有的应用程序中运行,也就是说,apscheduler为我们提供了构建专用调度器或调度服务的基础模块。


通过pip安装apscheduler模块: pip install apscheduler 或者 pip-3 install apscheduler

基本概念介绍

触发器(triggers) : 触发器包含调度逻辑,描述一个任务何时被触发, 按日期或按时间间隔或按cronjob表达式三种方式触发。每个作业都有它自己的触发器,除了初始配置之外,触发器是完全无状态的。

作业存储器(job stores):作业存储器指定了作业被存放的位置,默认情况下作业保存在内存,也可将作业保存在各种数据库中,当作业被存放在数据库中时,它会被序列化,当被重新加载时会反序列化。作业存储器充当保存、加载、更新和查找作业的中间商。分配器无法共享作业存储。

执行器(executors) : 执行器是将指定的作业(调用函数)提交到线程池或进程池中运行,当任务完成时,执行器通知调度器触发相应的事件。调度器(schedulers): 任务调度器,属于控制触,通过它配置作业存储器、执行器和触发器,添加、修改和删除任务。调度器协调触发器、作业存储器、执行器的运行,通常只有一个调度程序运行在应用程序中,开发人员通常不需要直接处理作业存储器、执行器或触发器,配置作业存储器和执行器是通过调度器来完成的。


实例:间隔性任务

#coding:utf-8         #声明编码为utf8
from datetime import datetime   #导入datetime模块
from apscheduler.schedulers.blocking import BlockingScheduler #导入BlockingScheduler模块
def tick():   #定义函数tick代表我们要调度的作业程序
          print("现在的时间是:%s"% datetime.now())
if __name__ == '__main__':
          scheduler = BlockingScheduler() #实例化BlockingScheduler类
          scheduler.add_job(tick,'interval',seconds=3)  #scheduler.add_job用于添加一个作业tick,触发器为interval,每隔三秒执行一次
       try:
                scheduler.start()
          except (KeyboardInterrupt,SystemExit):  #KeyboardInterrupt表示用户终端执行就是常用的ctrl+c,systemexit表示解释器异常退出
                pass   #如果两种都异常的那么什么都不做


实例:cron任务

#coding:utf-8
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def tick():
       print("目前的时间是:%s"% datetime.now())
if __name__ == '__main__':
       scheduler = BlockingScheduler()
       scheduler.add_job(tick,'cron',hour=23,minute=29)
       try:
               scheduler.start()
       except (KeyboardInterrupt,SystemExit):
               pass

定时cron任务,直接给触发器trigger传入cron

比如 hour=23,minute=29 就是表示每天的23:29分执行任务


hour =19,minute =23 # 19: 23执行任务

minute = 1*/5' #表示每5分钟执行一次

hour ='19-21', minute= '23'#表示19:23、20:23、21:23各执行一次任务