当前位置: 首页 > 面试题库 >

Python请求,如何限制接收大小,传输速率和/或总时间?

袁高明
2023-03-14
问题内容

我的服务器会发出外部请求,但我想限制失败请求可能造成的损害。在以下情况下,我希望取消请求:

  • 请求的总时间超过一定限制(即使数据仍在到达中)
  • 接收到的总大小超出某个限制(我需要先取消才能接受更多数据)
  • 传输速度下降到某个水平以下(尽管如果可以提供总时限,我可以没有这个水平)

注意我不是timeout在请求中寻找参数,因为这仅是针对不活动的超时。我找不到与总超时或限制总大小有关的方法。一个示例显示了一个maxsize参数,HTTPAdapter但没有记录。

如何使用达到这些要求requests


问题答案:

您可以尝试设置stream=True,然后在读取数据块时超出时间或大小限制时中止请求。

requests版本2.3.0开始,超时也适用于流请求,因此您需要做的就是允许初始连接和每个迭代步骤都超时:

r = requests.get(..., stream=True, timeout=initial_timeout)
r.raise_for_status()

if int(r.headers.get('Content-Length')) > your_maximum:
    raise ValueError('response too large')

size = 0
start = time.time()

for chunk in r.iter_content(1024):
    if time.time() - start > receive_timeout:
        raise ValueError('timeout reached')

    size += len(chunk)
    if size > your_maximum:
        raise ValueError('response too large')

    # do something with chunk

根据需要调整超时时间。

对于requests版本低于2.3.0(包括此更改)的版本,您无法超时r.iter_content()。在块中间停止响应的服务器仍会占用连接。您必须将以上代码包装在其他超时功能中,以尽早切断长时间运行的响应。



 类似资料:
  • 问题内容: API通常具有用户必须遵循的速率限制。举个例子,让我们50个请求/秒。连续的请求采取0.5-1秒,因此是来接近极限速度太慢。但是,使用aiohttp的并行请求超出了速率限制。 轮询API尽可能快地允许,需要限速并行调用。 例如,我发现到目前为止装饰,大约像这样: 这非常适用于连续通话。试图并行调用来实现这个按预期不起作用。 下面是一些代码示例: 这里的问题是,它会率限制 排队 的任务。

  • 问题内容: 我正在用GRequests和lxml在Python 2.7.3中编写一个小脚本,这将允许我从各个网站收集一些可收集的卡价格并进行比较。问题是网站之一限制了请求的数量,如果我超过了它,则会发回HTTP错误429。 有没有一种方法可以限制GRequestes中的请求数量,以使我不超过我指定的每秒请求数量?另外-如果发生HTTP 429,如何让GRequestes在一段时间后重试? 附带说明

  • 我正在用Python 2.7.3编写一个小脚本,其中包含GRequests和lxml,它将允许我从各种网站收集一些可收集的卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回HTTP错误429。 有没有办法在grequests中增加限制请求数,这样我就不会超过我指定的每秒请求数?还有——如果HTTP 429出现,我如何让GRequestes在一段时间后重试? 另一方面,他们

  • 我正在使用ProjectReactor使用rest从web服务加载数据。这是与多个线程并行完成的。我开始达到web服务的速率限制,因此我希望每秒最多发送10个请求,以避免出现这些错误。用Reactor我该怎么做? 使用zipWith(Mono.delayMillis(100))?还是有更好的办法? 非常感谢。

  • 我正在构建一个应用程序,其中包括一个公共API的刮板。我想限制我的请求的速率,但不是固定的速率,而是一个动态的随机速率,它在请求之间变化,并且落在一定的范围内,即我可以设置请求之间的最小和最大延迟。 我也不想阻塞当前线程。 我研究了Guava Ratelimiter、RatelimitJ和令牌桶算法,但看了文档,我看不出这些东西是如何达到我想要的。 给定250-350ms的速率限制范围时,对我的请

  • 我正在写一个网络爬虫,运行并行抓取许多不同的域。我想限制每秒向每个域发出的请求数量,但我不关心打开的连接总数,也不关心跨所有域发出的每秒请求总数。我想最大限度地增加打开连接和每秒请求的总数,同时限制对单个域的每秒请求数。 我可以找到的所有现有示例(1)限制打开连接的数量,或(2)限制在fetch循环中每秒发出的请求总数。例子包括: aiohttp:速率限制并行请求 它们都不做我要求的事情,即限制每