【发布时间】:2018-07-18 19:49:18
【问题描述】:
API 通常有用户必须遵守的速率限制。例如,让我们以 50 个请求/秒为例。顺序请求需要 0.5-1 秒,因此太慢而无法接近该限制。但是,使用 aiohttp 的并行请求超过了速率限制。
要尽可能快地轮询 API,需要限制并行调用的速率。
目前我发现的示例装饰session.get,大致如下:
session.get = rate_limited(max_calls_per_second)(session.get)
这适用于顺序调用。尝试在并行调用中实现这一点无法按预期工作。
下面是一些代码示例:
async with aiohttp.ClientSession() as session:
session.get = rate_limited(max_calls_per_second)(session.get)
tasks = (asyncio.ensure_future(download_coroutine(
timeout, session, url)) for url in urls)
process_responses_function(await asyncio.gather(*tasks))
这样做的问题是它会限制任务的排队。 gather 的执行仍将或多或少同时发生。两全其美;-)。
是的,我在这里aiohttp: set maximum number of requests per second 发现了一个类似的问题,但两个回复都没有回答限制请求率的实际问题。 the blog post from Quentin Pradet 也仅适用于限制排队的速率。
总结一下:对于并行aiohttp 请求,如何限制每秒的请求数?
【问题讨论】:
-
@user1929959 是的,正如我在帖子中提到的那样。不幸的是,这个问题没有得到正确回答。回复谈到限制同时请求的数量。询问的是每秒的请求数。
标签: python parallel-processing python-asyncio aiohttp