python - 在 RQ 中重试失败的作业

标签 python web-applications asynchronous wsgi

我们正在使用 RQ使用我们的 WSGI 应用程序。我们所做的是在运行任务的不同后端服务器中有几个不同的进程,连接到(可能)几个不同的任务服务器。为了更好地配置此设置,我们在系统中使用自定义管理层,负责运行工作人员、设置任务队列等。

当作业失败时,我们希望实现重试,在延迟增加后重试作业几次,最终要么完成它,要么让它失败并在我们的日志系统中记录错误条目。但是,我不确定应该如何实现。我已经创建了一个自定义工作脚本,它允许我们将错误记录到我们的数据库中,我第一次尝试重试是这样的:

# This handler would ideally wait some time, then requeue the job.
def worker_retry_handler(job, exc_type, exc_value, tb):
    print 'Doing retry handler.'
    current_retry = job.meta[attr.retry] or 2

    if current_retry >= 129600:
        log_error_message('Job catastrophic failure.', ...)
    else:
        current_retry *= 2

        log_retry_notification(current_retry)
        job.meta[attr.retry] = current_retry
        job.save()
        time.sleep(current_retry)

        job.perform()

return False

正如我提到的,我们在 worker 文件中还有一个函数可以正确解析它应该连接的服务器,并且可以发布作业。问题不一定是如何发布作业,而是如何您在异常处理程序中获得的作业实例。

如有任何帮助,我们将不胜感激。如果有关于更好的方法的建议或指示也很好。谢谢!

最佳答案

我看到两个可能的问题:

  1. 你应该有一个返回值。 False 会阻止作业发生默认异常处理(请参阅本页的最后一节:http://python-rq.org/docs/exceptions/)

  2. 我认为当您的处理程序被调用时,作业已不再排队。我不是 100% 肯定(特别是考虑到我上面提到的文档),但如果它在失败队列中,您可以调用 requeue_job(job.id) 重试。如果不是(听起来好像不会),您可能会获取适当的队列并直接入队。

关于python - 在 RQ 中重试失败的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14389609/

相关文章:

python - 魔术模拟 assert_called_once 与 assert_called_once_with 奇怪的行为

python - 尝试打印从 0 到 x 的范围,用单词替换偶数位,最后一位数字为 None

Python 的 self.parse - 我们为什么使用它?

javascript - SproutCore 安全和身份验证问题

javascript - 准备好的语句未在带有 mssql 的 Node js 中执行

Swift (IOS) 更新异步函数中的参数

node.js - 是否需要在异步调用中嵌套异步调用? ( Node .js)

java - 斯坦福标注器不工作

java - 如何使用java itext保存pdf

javascript - 调整页面内容的大小以适合一个打印页面