Jua*_*oto 9 python asynchronous wsgi web-applications
我们正在使用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
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,我们在worker文件中也有一个函数可以正确地解析它应该连接的服务器,并且可以发布作业.问题不一定是如何发布作业,而是如何处理在异常处理程序中获得的作业实例.
任何帮助将不胜感激.如果有更好的方法可以提出建议或指示,这也会很棒.谢谢!
我看到两个可能的问题:
你应该有一个返回值。False 可防止作业发生默认异常处理(请参阅本页的最后一部分: http: //python-rq.org/docs/exceptions/)
我认为当你的处理程序被调用时,作业不再排队。我不是 100% 肯定(特别是考虑到我上面指出的文档),但如果它位于失败的队列中,您可以调用 requeue_job(job.id) 来重试。如果不是(听起来好像不会),您可能可以获取适当的队列并直接入队。