今天自学了下任务调度机。
就是定时任务。
然后上网查,人人都说apscheduler这个模块好。
我信了好吧。
查了查任务调度程序的网站:
既然有官方文档,我就不献丑瞎写了——官方文档说的通俗易懂,(但是总觉得某些功能没说),直接去看官方文档就好。
https://apscheduler.readthedocs.io/en/stable/index.html
给我的感觉:
本机调度,基本上没有什么问题,但是多主机调度似乎并不行。
这个脚本的路径都很深(我第一次看到脚本这么深的)
常见的调度有两种:阻塞性BlockingScheduler和非阻塞性的ackgroundScheduler,还有其他全局优化的调度器。
阻塞性就是:一次只能运行一个脚本,其他脚本不能运行。
非阻塞性就是:多个脚本并行。
大概逻辑很简单:每个系统有个执行器,然后你往执行器里写入需要运行的脚本和函数并定好时间,然后开启执行器就可以了。
调度机有这么几个好处:定时、稳定、独立。
比如说:某个进程报错退出,是并不影响其他任务的运行的。支持并行(不过PYTHON似乎是有全局锁的,一个时间点只能运行一个进程,不是真正的并行),但是程序里面有一个似乎支持多核,以后看看。
我查官方文档生成的调度机如下:
# 堵塞性调度器,每次只能运行一个进程
from apscheduler.schedulers.blocking import BlockingScheduler
# 并行性调度器,可以在后台运行多个进程
from apscheduler.schedulers.background import BackgroundScheduler
# 报错模式
from apscheduler.events import EVENT_JOB_ERROR, EVENT_JOB_MISSED
from loguru import logger
import arrow
import time
import datetime
def log():
logger.debug(arrow.now())
def log1():
logger.warning('定时任务2')
def listen(event):
logger.warning(event.exception)
# 非阻塞调度器,后台运行,不影响整个进程
scheduler = BackgroundScheduler()
# 标准的调度写法
# jitter振动器,可以动态调整程序运行时间,防止程序运行堵塞
scheduler.add_job(log, 'interval', seconds=30, jitter=1)
# 不等待直接调用任务调度
# id可以指定任务的ID
# insterval是间隔
scheduler.add_job(log1, 'interval', seconds=30, jitter=1, id='1', next_run_time=datetime.datetime.now())
# 选择只显示错过和故障
scheduler.add_listener(listen, EVENT_JOB_ERROR | EVENT_JOB_MISSED)
# 开始事务
# 调度机开始的时候,就不能够修改程序的状态
scheduler.start()
# 获取所有的事务
logger.info(scheduler.get_jobs())
logger.debug('over!')
time.sleep(600)