python - 如何处理 requests_futures 的速率限制?

标签 python rest python-requests

我一直在使用 Python 请求从 API 获取数据,但我想通过与 requests_futures 异步运行来加快速度。我每分钟只允许 200 个 API 请求,所以我必须检查这个并等待指定的秒数再重试。此数字在 Retry-After header 中返回。这是原始的工作代码:

  session = requests.Session()
  for id in ticketIds:
    url = 'https://colorfront.zendesk.com/api/v2/tickets/' + str(id) + '/comments.json'
    req = requests.get(url, auth=zd_secret)

    if req.status_code == 429:
      time.sleep(int(req.headers['Retry-After']))
      req = requests.get(url, auth=zd_secret)

    comments += req.json()['comments']

以下异步代码会一直运行,直到达到速率限制,然后所有请求都会失败。

session = FuturesSession()
  futures = {}
  for id in ticketIds:
    url = 'https://colorfront.zendesk.com/api/v2/tickets/' + str(id) + '/comments.json'
    futures[id] = session.get(url, auth=zd_secret)

  for id in ticketIds:
    comments += futures[id].result().json()['comments']

当我达到速率限制时,我需要一种方法来仅重试失败的请求。 requests_futures 是否有一些内置的方法来处理这个问题?

更新:requests_futures 库没有为此内置任何内容。我发现了这个相关的开放问题:https://github.com/ross/requests-futures/issues/26 .因为我知道 API 限制,所以我会尝试预先调整请求的速度,但如果我组织的另一个用户同时访问相同的 API,那将无济于事。

最佳答案

您应该能够使用 urllib3.util.retry 中的 Retry 模块实现这一目标:

from requests_futures.sessions import FuturesSession
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = FuturesSession()
retries = 5
status_forcelist = [429]
retry = Retry(
     total=retries,
     read=retries,
     connect=retries,
     respect_retry_after_header=True,
     status_forcelist=status_forcelist,
)

adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

futures = {}
for id in ticketIds:
    url = 'https://colorfront.zendesk.com/api/v2/tickets/' + str(id) + '/comments.json'
    futures[id] = session.get(url, auth=zd_secret)

for id in ticketIds:
    comments += futures[id].result().json()['comments']

关于python - 如何处理 requests_futures 的速率限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58255753/

相关文章:

ios - 只需一次将对象添加到 Realm 列表

api - OSM API如何按城市获取所有郊区?

selenium - Requests 或 Urllib - 登录网站,将下载请求发送到 url,并另存为 xlsx

python - 苹果Mac Book Pro M1 Chip segmentation Error when using python requests library

python - 可以使用相同的内核参数在tensorflow或keras中重复使用Con2d吗

python - 如何迭代 HTML 数据中所有表的代码?

python - 有没有办法可以在 ajax 调用的成功函数中下载文件?

Python:避免此代码的 if 条件?

java - 如何使用 Java 1.5 和 jersey 1.2 公开 RESTful Web 服务,.class 文件中的版本号错误

python - 使用 python (Flask) 从 qwant API 接收数据