进行异步 API 调用时如何限制 Grequests?

Posted

技术标签:

【中文标题】进行异步 API 调用时如何限制 Grequests?【英文标题】:How to throttle Grequests when making asynchronous API calls? 【发布时间】:2019-01-31 00:28:23 【问题描述】:

我正在使用 grequests 库来传递 ~250000 个 url 以从 api 获取数据。

API 限制为每秒 100 次调用。

如何限制 grequest 以每秒仅传递 100 个 URL?我将大小参数从 5 增加到 100。不确定这是做什么的,但仍然运行到错误“超出最大重试次数”。

到目前为止,这是我的代码:

import grequests

lst = ['url.com','url2.com']

class Test:
    def __init__(self):
        self.urls = lst

    def exception(self, request, exception):
        print ("Problem: : ".format(request.url, exception))

    def async(self):
        return grequests.map((grequests.get(u) for u in self.urls), exception_handler=self.exception, size=100)

    def collate_responses(self, results):
        return [x.text for x in results]

test = Test()
#here we collect the results returned by the async function
results = test.async()

response_text = test.collate_responses(results)

【问题讨论】:

【参考方案1】:

Grequests 似乎发出了 100 个请求,然后在没有任何等待的情况下又发出了 100 个请求,依此类推。这些请求之间没有定义时间。 这是一个用解决方案描述的类似问题: Limiting/throttling the rate of HTTP requests in GRequests

【讨论】:

以上是关于进行异步 API 调用时如何限制 Grequests?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .net Core API 项目中跨多个线程限制对 HttpClient 的所有传出异步调用

使用 fetch 在节点中进行异步 api 调用的最佳实践?

Flask 的异步调用方法

并行调用API,每分钟有硬性限制。

Oauth2;如何解决多个异步 api 调用期间 AccessToken 过期的问题,同时进行?

如何在useEffect(func,[])中使用异步api调用中的setState钩子测试组件