pythonrq调度程序:在一段时间后将失败的作业排队

up9lanfz  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(411)

我使用pythonrq在后台执行一个作业。作业调用第三方restapi并将响应存储在数据库中(参考下面的代码)

@classmethod
def fetch_resource(cls, resource_id):
   import requests

   clsmgr = cls(resource_id)

   clsmgr.__sign_headers()

   res = requests.get(url=f'http://api.demo-resource.com/{resource_id}', headers=clsmgr._headers)

   if not res.ok:
     raise MyThirdPartyAPIException(res)

   ....

第三方api有一些速率限制,比如每分钟7个请求。我已经创建了一个重试处理程序来优雅地处理 429 too many requests http状态码,并在一分钟后重新排队作业(时间单位根据速率限制更改)。要在一段时间后重新排队作业,我使用 rq-scheduler . 请找到下面所附的处理程序代码,

def retry_failed_job(job, exc_type, exc_value, traceback):

   if isinstance(exc_value, MyThirdPartyAPIException) and exc_value.status_code == 429:

     import datetime as dt

     sch = Scheduler(connection=Redis())

     # sch.enqueue_in(dt.timedelta(seconds=60), job.func_name, *job.args,**job.kwargs)

我在将失败的作业重新排入任务队列时遇到问题。因为我不能直接打电话给 sch.enqueue_in(dt.timedelta(seconds=60), job) 在处理程序代码中(根据doc,job来表示延迟的函数调用)。如何将作业函数与所有arg和kwarg重新排队?
任何帮助将不胜感激,请让我知道,如果有任何更好的方法来处理api速率限制。
干杯伙计们!

ncgqoxb0

ncgqoxb01#

啊,下面的陈述就行了, sch.enqueue_in(dt.timedelta(seconds=60), job.func, *job.args,**job.kwargs) 问题仍然悬而未决,请告诉我是否有人在这方面有更好的方法。

相关问题