gpt4 book ai didi

python - 如何使用上下文管理器处理 API 速率限制?

转载 作者:行者123 更新时间:2023-11-28 18:23:54 25 4
gpt4 key购买 nike

我正在尝试编写上下文管理器来处理 GitHub 速率限制异常。本质上,我希望它监听错误,当它发生时,动态拉取重置时间(全部通过 GitHub API 完成),并等待那个时间量。在这一点上,我希望它恢复程序,并根据需要多次执行此操作以完成工作。

这是我目前所拥有的:

@contextlib.contextmanager
def api_rate_manager(api_obj: g3.GitHub):
# Check for the API ratelimit being exhausted. Limited to 5k
# requests per hour.
try:
yield
except GitHubError as e:
if 'rate limit exceeded' in e.msg.lower():
info = g3.rate_limit()['resources']['core']
reset = mu.convert_unix_timestamp(info.get('reset'))
delta = reset - datetime.now()
sleep(
delta.seconds + 1) # Add a second to account for milliseconds

目前,它会正确地捕获错误并等待,但随后它只是退出程序(这是有道理的),而不是绕回来继续。我知道我可以检查代码以查看剩余限制是多少,如果达到 0 则等待,但我想练习上下文管理器。

它将按以下方式使用:

        with api_rate_manager(gh):
for commit_iter in commit_iters:
handler: gu.EtagHandler = commit_iter.etag_handler
for commit in commit_iter:
if not commit:
continue

commit.refresh()
author_data: dict = commit.commit.author
data = {
'sha': commit.sha,
'author': author_data.get('name'),
'author_email': author_data.get('email'),
'create_date': author_data.get('date'),
'additions': commit.additions,
'deletions': commit.deletions,
'total': commit.total
}
mu.add_etl_fields(data)
writer.writerow(data)
has_data = True
etag: str = commit_iter.get_etag()
if etag:
logger.info(f'Etag for {commit_iter.name}: {etag}')
handler.store_in_db(etag=etag)

最佳答案

虽然上下文管理器使用 yield(就像在生成器中一样),但它只生成一次。 See contextlib's documentation .

因此,如果在您的上下文管理器中捕获到异常,则在 yield 后继续执行并退出。您可能想要颠倒上下文管理器和主迭代的顺序。请参阅下面的示例。

上下文管理器:

import contextlib
from time import sleep

@contextlib.contextmanager
def api_rate_manager():
try:
yield
except KeyError as e:
print('sleeping')
sleep(3)

测试用例 1:

a = {0:0,1:2,2:4,3:6,5:10}

with api_rate_manager():
for i in range(8):
print(a[i])

输出:

0
2
4
6
sleeping

测试用例 2:

for i in range(8):
with api_rate_manager():
print(a[i])

输出:

0
2
4
6
sleeping
10
sleeping
sleeping

关于python - 如何使用上下文管理器处理 API 速率限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42866347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com