“Python实现定时器”的版本间的差异
(创建页面,内容为“ == Python实现定时器 == 在Linux下的任务调度分为两类:系统任务调度、用户任务调度 系统任务调度:系统周期性所要执行的工…”) |
|||
第47行: | 第47行: | ||
通过pip安装apscheduler模块: pip install apscheduler 或者 pip-3 install 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各执行一次任务 |
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各执行一次任务