apscheduler定时任务报错

最近使用的定时任务遇到了2个问题,简单记录一下

报错1:Run time of job xxxx was missed!

我用的是BackgroundScheduler,创建的任务进jobstore调度,然后executor执行。executor是用多线程执行job的,这个报错就是说这个任务的执行时间到了,但是没有空闲的线程可以用。

BackgroundScheduler还有一个misfire_grace_time参数,当线程都忙时,会等待多久,默认是1s。
综上,原因就是某个时刻,某个job的执行时间到了,但是所有线程都忙,等了misfire_grace_time时间后依然没有线程空出来,所有就报run time of job was missed!

综上,解决办法有2种:

  1. 增加executor中并发的线程数量;
  2. 增加等待时间,也就是misfire_grace_time

executor默认的线程数是10,如果无法确定自己使用的是几,可以自己多加几个定时任务试出来,测试示例:

from apscheduler.schedulers.background import BackgroundScheduler
from loguru import logger
import threading
import time

scheduler_plan = BackgroundScheduler(timezone='Asia/Shanghai')
# 定义多个定时任务,比如20个,同时启动
@register_job(scheduler_plan, "interval", seconds=10, replace_existing=True)
def task1():
    #  打印线程名称 ,看执行了几个任务后使用了相同的线程
    logger.info(“task1, {}.format(threading.current_thread().name)# 避免任务太快结束,增加sleep
    time.sleep(10)

try:
    # 启动
    scheduler_plan.start()
    # 定时任务是后台运行的,python执行完任务就没了,所以这里要添加sleep,否则无法看到任务执行的过程打印,sleep时间根据定时任务数量控制
    time.sleep(20)
except Exception as e:
    logger.error("".format(e))
    # 有错误就停止定时器
    scheduler_plan.shutdown()

报错2:maximum number of running instances reached!

apscheduler中会配置每个job在同一时刻允许执行的max_instances,默认是1。
这个报错就是说,上一个时刻的job A 还没执行完呢,下一个定时时间又到了,说白了就是这个任务的执行时长大于任务的执行周期了,上个job A不执行完,就无法执行下一次的job。

解决方式:要么优化任务执行耗时,要么延长执行周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值