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模块传参的时候可以在调用函数名后,以,分割,直接赋值。
平常建议使用第二种,不堵塞,用起来也简单,快。
第一种使用想解决堵塞应该可以用多线程和多进程,来防止定时器执行函数堵塞代码。
申明:本人菜鸡,该文章只做个人记录、备忘使用,出现错误请海涵。
目录
1、BlockingScheduler库
2、threading