Python 任务队列 RQ 中的异常 ( Exceptions )

yufei       4 年, 2 月 前       825

如果作业任务在执行时发生了异常,那么可能会导致作业任务失败

那么,因为 RQ 工作进程是运行在后台的,我们又要如何得到这些异常的通知 ?

默认: 失败队列

当异常发生时,RQ 的默认处理机制是失败队列 ( failed )

每个执行失败的作业任务以及其异常信息 ( 类型,值,回溯 ) 都会存储在此处

虽然这可以确保不会丢失失败的作业任务,但也无法主动获取关于作业任务执行失败的通知

为什么呢 ?

其实 RQ 只会简单的将执行失败的作业及相关信息静静的存放到失败队列,如果要获取失败的工作任务,还要自己去读取失败队列

自定义异常处理器

从版本 0.3.1 开始,RQ 支持注册自定义异常处理程序

这样就可以完全替换默认行为( 将作业任务发送到失败的队列 ),或者在发生异常时采取其它步骤

向 RQ 工作进程注册自定义的异常处理程序的方法如下

from rq.handlers import move_to_failed_queue  # RQ 默认的异常处理器

w = Worker([q], exception_handlers=[my_handler, move_to_failed_queue])
...

RQ 工作进程会向异常处理器传递以下参数 jobexc_typeexc_valuetraceback

也就是说异常处理器的函数原型如下

def my_handler(job, exc_type, exc_value, traceback):
    # 一些自定义的处理逻辑
    # 例如把异常写入数据库
    ...

当然了,因为 Python 的特性,该异常处理器的函数原型还可以是

def my_handler(job, *exc_info):
    # 一些自定义的处理逻辑
    ...

异常处理器链

RQ 支持异常处理器链,也就是说异常处理器本身负责决定是否完成异常处理,或者应该落到堆栈上的下一个处理程序

异常处理程序可以通过返回布尔值来指示这一点

  1. False 表示停止处理异常
  2. True 表示继续并进入堆栈的下一个异常处理程序

对于实现者来说,有一点很重要,就是

默认情况下,当处理程序没有显式返回值 ( 因此为 None ) 时,将被解释为 True,即继续使用下一个处理程序

如果想要替换默认的异常处理行为 ( 将作业任务移动到失败队列 ),自定义的异常处理器必须返回 False,也就是停止处理异常

def black_hole(job, *exc_info):
    return False
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.