tom12345654 2022-12-30 15:55 采纳率: 25%
浏览 73
已结题

Django apscheduler 定时任务执行的时候报错

Django 后端运行定时任务不断的通过淘宝api获取订单数据,但是运行过程中,容易报错,然后卡死不继续执行定时任务了

错误信息提示如下图:

img

img

订单任务的代码是:

import apscheduler
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
from django_apscheduler.jobstores import DjangoJobStore
import time
from shops.views import downloadOrder

scheduler = BackgroundScheduler(daemon=True)

def test_job():
    try:
        downloadOrder(1)
        # print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    except:
        print('--------------------------------------')
        print('出现问题啦')
        print('重新启动任务…………')
        print('--------------------------------------')
        scheduler.remove_job('test')
        scheduler.start()
    # print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

# 定时任务,打印当前的时间
scheduler.add_job(test_job, 'interval', minutes=2, id='test')
# @scheduler.scheduled_job(trigger='interval', seconds=1, id='test')

# scheduler.remove_job('test')
scheduler.start()

我希望忽略错误继续执行定时任务也行。但是很想搞清楚这个错误是怎么来的,怎么解决

  • 写回答

7条回答 默认 最新

  • |__WhoAmI__| 2022-12-30 16:05
    关注

    看到这个错误,我觉得可能是两个问题导致的:

    1、在执行任务的代码中可能存在未捕获的异常,导致任务执行失败并停止。

    2、也可能是 downloadOrder 这个函数在执行过程中出现了错误,导致任务执行失败并停止。

    为了解决这个问题,可以考虑以下几种方法:

    1、在执行任务的代码中,使用 try-except 语句捕获异常,并在 except 块中处理错误。这样就可以在出现错误的情况下继续执行任务。

    2、在调用 downloadOrder 函数的时候,使用 try-except 语句捕获异常,并在 except 块中处理错误。这样就可以在出现错误的情况下继续执行任务。

    3、在执行任务的代码中,使用 try-except 语句捕获异常,并在 except 块中记录错误日志,方便后续排查问题。这样就可以在出现错误的情况下继续执行任务,并且可以通过日志记录来分析问题。

    例如可以将代码修改为如下形式:

    import logging
    
    
    def test_job():
        try:
            downloadOrder(1)
        except Exception as e:
            logging.error(e)
            print('--------------------------------------')
            print('出现问题啦')
            print('重新启动任务…………')
            print('--------------------------------------')
            scheduler.remove_job('test')
            scheduler.start()
    

    这样如果在执行任务的过程中出现了错误,就会记录下错误信息,并重新启动任务。

    当然,为了更好地排查问题,还可以考虑使用 APScheduler 提供的事件机制,在任务执行成功或出错的时候触发相应的事件,从而可以记录下执行情况,方便后续排查问题。

    例如可以在代码中添加如下事件处理函数:

    def job_success_handler(event):
    
    
    if event.exception:
        print('任务执行失败')
    else:
        print('任务执行成功')
    
    
    def job_error_handler(event):
    
    
        print('任务执行出错')
    
        scheduler.add_listener(job_success_handler, EVENT_JOB_EXECUTED)
        scheduler.add_listener(job_error_handler, EVENT_JOB_ERROR)
    

    这样在任务执行成功或出错的时候,就会触发对应的事件,从而可以记录下执行情况。
    望采纳。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月7日
  • 修改了问题 12月30日
  • 创建了问题 12月30日

悬赏问题

  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画
  • ¥15 hadoop中启动hive报错如下怎么解决