Задержка между запросами с использованием github3 в python
Я использую модуль python github3, и мне нужно установить задержку между запросами к github api, потому что мое приложение сильно загружает сервер.
Я делаю такие вещи, как
git = github3.GitHub()
for i in itertools.chain(git.all_repositories(), git.repositories(type='private')):
do things
Я обнаружил, что GitHub использует запросы, чтобы сделать запрос к github api. https://github.com/sigmavirus24/github3.py/blob/3e251f2a066df3c8da7ce0b56d24befcf5eb2d4b/github3/models.py
Но я не могу понять, какой параметр я должен передать или какой атрибут я должен изменить, чтобы установить некоторую задержку между запросами.
Можете мне что-нибудь посоветовать?
2 ответа
Я использую следующую функцию, когда ожидаю превышения лимита моего запроса:
def wait_for_karma(gh, min_karma=25, msg=None):
while gh:
core = gh.rate_limit()['resources']['core']
if core['remaining'] < min_karma:
now = time.time()
nap = max(core['reset'] - now, 0.1)
logger.info("napping for %s seconds", nap)
if msg:
logger.info(msg)
time.sleep(nap)
else:
break
Я позвоню перед тем, как позвонить, который, на мой взгляд, "большой" (то есть может потребоваться несколько вызовов API для удовлетворения). Основываясь на вашем примере кода, вы можете сделать это в нижней части цикла:
git = github3.GitHub()
for i in itertools.chain(git.all_repositories(), git.repositories(type='private')):
do_things()
wait_for_karma(git, msg="pausing")
github3.py в настоящее время не имеет опций для принудительной задержки между запросами. Тем не менее, есть способ получить метаданные запроса, которые включают количество запросов, которые вы оставили в вашем ограничении скорости, а также когда этот предел ограничения должен быть сброшен. Я предлагаю вам использовать git.rate_limit()['resources']['core']
чтобы определить, какие задержки вы должны установить для себя в вашем собственном цикле.