1、BlockingScheduler库
缺点:会阻塞代码
优点:调用定时函数时方便灵活定义定时,比如间隔多长时间调用一次,比如那几个月调用一次
代码:
from apscheduler.schedulers.blocking import BlockingScheduler import datetime # 这个定时是阻塞定时 # 循环调用 # 该定时器的函数可以随意定时间,包括每天或者某一天,某几个月的,哪个时间点进行触发 ''' 首先看看周一到周五定时执行任务 # 输出时间 def job(): print(datetime.now().strtime("%Y-%m-%d %H:%M:%S")) # BlockingScheduler scheduler = BlockingScheduler() scheduler.add_job(job, "cron", day_of_week = "1-5", hour = 6, minute = 30) schduler.start() scheduler.add_job(job, 'cron', hour=1, minute=5) hour = 19, minute = 23 这里表示每天的19:23 分执行任务 hour = '19', minute = '23' 这里可以填写数字,也可以填写字符串 hour = '19-21', minute = '23' 表示 19: 23、 20: 23、 21: 23 各执行一次任务 # 每300秒执行一次 scheduler.add_job(job, 'interval', seconds=300) # 在1月,3月,5月,7-9月,每天的下午2点,每一分钟执行一次任务 scheduler.add_job(func=job, trigger='cron', month='1,3,5,7-9', day='*', hour='14', minute='*') # 当前任务会在 6、7、8、11、12 月的第三个周五的 0、1、2、3 点执行 scheduler.add_job(job, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3') # 从开始时间到结束时间,每隔俩小时运行一次 scheduler.add_job(job, 'interval', hours=2, start_date='2018-01-10 09:30:00', end_date='2018-06-15 11:00:00') ''' def startCronTask(task, **config): # BlockingScheduler scheduler = BlockingScheduler() scheduler.add_job(task, 'interval', **config) scheduler.start() def userCountFunc(): # 获取当前时间 current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(current_time) print("hello world") # 获取当前时间 current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(current_time) def main(): # 获取当前时间 current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(current_time) startCronTask(userCountFunc, minutes=1) # 获取当前时间 current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(current_time) if __name__ == '__main__': main()
2、threading
线程定时
缺点:需要在定时器执行函数内部重复构造定时器,才能达到重复循环定时的目的
优点:不阻塞程序
代码:
import threading import datetime import time # 使用threading线程定时,该定时不堵塞 # 如果需要传参 def timerFunc(): print('Hello World~') #想要进行循环定时必须在定时器执行函数内部重复构造定时器,因为定时器构造后只执行1次,必须循环调用 '''''' global timer timer = threading.Timer(10, timerFunc) timer.start() # 此处要用引用函数的格式timerFunc,而不是运行函数的格式timerFunc(),不然会报错 timer = threading.Timer(10, timerFunc) timer.start() # 如果调用的函数需要传参 ''' #函数名后以逗号分割进行传参 timer = threading.Timer(10, timerFunc,"a") timer.start() ''' time.sleep(60) # 取消定时 timer.cancel()
备注:threading模块传参的时候可以在调用函数名后,以,分割,直接赋值。
平常建议使用第二种,不堵塞,用起来也简单,快。
第一种使用想解决堵塞应该可以用多线程和多进程,来防止定时器执行函数堵塞代码。
申明:本人菜鸡,该文章只做个人记录、备忘使用,出现错误请海涵。
目录