Python rq-планировщик: ставить невыполненное задание через некоторое время - PullRequest
0 голосов
/ 22 февраля 2020

Я использую python RQ для выполнения задания в фоновом режиме. Задание вызывает сторонний API отдыха и сохраняет ответ в базе данных. (См. Код ниже)

@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 запросов в минуту. Я создал обработчик повторных попыток, чтобы изящно обрабатывать код состояния HTTP 429 too many requests и заново ставить задачу в очередь через минуту (единица времени изменяется в зависимости от ограничения скорости). Чтобы через некоторое время поставить работу в очередь, я использую 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) в коде обработчика (согласно do c, задание для представления отложенного вызова функции). Как я могу поставить в очередь задание со всеми аргументами и аргументами?

Любая помощь будет высоко ценится, и, пожалуйста, дайте мне знать, если есть какие-либо более эффективные подходы для обработки ограничения API.

Ура, ребята!

1 Ответ

0 голосов
/ 22 февраля 2020

Ааа, следующее утверждение делает работу,

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

Вопрос все еще открыт, дайте мне знать, если у кого-то есть лучший подход к этому.

...