1.循环sleep
这种方式最简单,在循环里面放入要执行的任务,然后 sleep 一段时间再执行
import time
class RunMainJson:
def __init__(self):
pass
def run_case(self):
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
runMainJson=RunMainJson()
if __name__=='__main__':
'''
每隔3min执行一次主方法
'''
while True:
runMainJson.run_case()
time.sleep(180)
print("每隔3min执行一次主方法=========================================================")
这个方法的缺点是,只能执行固定间隔时间的任务,如果有定时任务就无法完成,比如早上六点半喊我起床。并且 sleep 是一个阻塞函数,也就是说 sleep 这一段时间,啥都不能做。
2.APScheduler定时框架
APScheduler是一个 Python 定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及 crontab 类型的任务,并且可以持久化任务
import time
import datetime
import os
import sys
base_path=os.getcwd()
sys.path.append(base_path)
from apscheduler.schedulers.blocking import BlockingScheduler
from Run.run_main_json import runMainJson
class RunTime:
def __init__(self):
pass
def func2(self):
time.sleep(2)
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func2 time:',ts)
def dojob(self):
#创建调度器:BlockingScheduler
scheduler = BlockingScheduler()
#添加任务,时间间隔180S
scheduler.add_job(runMainJson.run_case, 'interval', seconds=180, id='test_job1')
print("走到这了吗")
#添加任务,时间间隔3S
scheduler.add_job(self.func2, 'interval', seconds=3, id='test_job2')
scheduler.start()
if __name__=='__main__':
runtime=RunTime()
runtime.dojob()
APScheduler四个组件
APScheduler 四个组件分别为:触发器(trigger),作业存储(job store),执行器(executor),调度器(scheduler)。
①触发器(trigger)
包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的
APScheduler 有三种内建的 trigger:
date: 特定的时间点触发
interval: 固定时间间隔触发
cron: 在特定时间周期性地触发
②作业存储(job store)
存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。
APScheduler 默认使用 MemoryJobStore,可以修改使用 DB 存储方案
③执行器(executor)
处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
最常用的 executor 有两种:
ProcessPoolExecutor
ThreadPoolExecutor
④调度器(scheduler)
通常在应用中只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。
配置调度器
APScheduler提供了许多不同的方式来配置调度器,你可以使用一个配置字典或者作为参数关键字的方式传入。你也可以先创建调度器,再配置和添加作业,这样你可以在不同的环境中得到更大的灵活性。
下面来看一个简单的 BlockingScheduler 例子
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
def job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
def job1():
print("该起床上班了~~~~~")
#创建调度器:BlockingScheduler
scheduler = BlockingScheduler()
#添加任务,时间间隔2S
scheduler.add_job(job, 'interval', seconds=2, id='test_job1')
print("走到这了吗")
#添加任务,时间间隔3S
scheduler.add_job(job1, 'cron', day_of_week='1-5', hour=18, minute=45, id='test_job2')
scheduler.start()