Я использую 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.
Ура, ребята!