我们正在使用 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 文件中还有一个函数可以正确解析它应该连接的服务器,并且可以发布作业。问题不一定是如何发布作业,而是如何您在异常处理程序中获得的作业实例。
如有任何帮助,我们将不胜感激。如果有关于更好的方法的建议或指示也很好。谢谢!
最佳答案
我看到两个可能的问题:
你应该有一个返回值。 False 会阻止作业发生默认异常处理(请参阅本页的最后一节:http://python-rq.org/docs/exceptions/)
我认为当您的处理程序被调用时,作业已不再排队。我不是 100% 肯定(特别是考虑到我上面提到的文档),但如果它在失败队列中,您可以调用 requeue_job(job.id) 重试。如果不是(听起来好像不会),您可能会获取适当的队列并直接入队。
关于python - 在 RQ 中重试失败的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14389609/