Python Tornado速率限制AsyncHttpClient获取

时间:2017-04-23 20:40:34

标签: python httprequest tornado rate-limiting

目前使用的API速率限制我每10秒3000次请求。我有10,000个使用Tornado获取的url,因为它具有异步IO特性。

如何实施速率限制以反映API限制?

from tornado import ioloop, httpclient

i = 0

def handle_request(response):
    print(response.code)
    global i
    i -= 1
    if i == 0:
        ioloop.IOLoop.instance().stop()

http_client = httpclient.AsyncHTTPClient()
for url in open('urls.txt'):
    i += 1
    http_client.fetch(url.strip(), handle_request, method='HEAD')
ioloop.IOLoop.instance().start()

1 个答案:

答案 0 :(得分:1)

您可以检查i的值在3000个请求的间隔中的位置。例如,如果i介于3000和6000之间,则可以将每个请求的超时设置为10秒,直到6000.在6000之后,只需将超时加倍。等等。

http_client = AsyncHTTPClient()

timeout = 10
interval = 3000

for url in open('urls.txt'):
    i += 1
    if i <= interval:
        # i is less than 3000
        # just fetch the request without any timeout
        http_client.fetch(url.strip(), handle_request, method='GET')
        continue # skip the rest of the loop

    if i % interval == 1:
        # i is now 3001, or 6001, or so on ...
        timeout += timeout # double the timeout for next 3000 calls

    loop = ioloop.IOLoop.current()
    loop.call_later(timeout, callback=functools.partial(http_client.fetch, url.strip(), handle_request, method='GET'))

注意:我只使用少量请求测试了此代码。由于您在i函数中减去ihandle_request的值可能会发生变化。如果是这种情况,你应该维护另一个类似于i的变量并对其进行减法。