Python的Requests模块中的requests.get()方法会暂停脚本直到响应返回吗?

9
这个问题涉及到Python的Requests模块。
我正在使用requests.get(),但遇到了一个问题:我超过了我要联系的服务器允许的请求速率限制。我在每个requests.get()后设置了time.sleep(),时间是数量级更大的数值。代码如下:
        for url in url_list:
            success = False
            response = requests.get(url) 
            while not success:
                time.sleep(1/250)
                if str(response) == "<Response [200]>":
                    time.sleep(1/250) # Wait Xs between API call      
                    do_stuff(response.text)
                    success = True

                else:
                    print(response)
                    print(response.headers)
                    time.sleep(3)
                    response = requests.get(url)

我在这里不断地增加我的速率,达到了每秒300个请求,但最多只应该发送每秒125个请求。Requests是否没有暂停脚本直到响应到达?我不确定。我该如何确保不会发送超过我的速率的请求?


2
如果你在使用Python2,可以使用time.sleep(0)。尝试使用1./250 - beezz
你确定唯一的限制是每秒300个请求(即没有其他日限制),并且你确定失败的请求是由于达到了该速率限制所致吗? - BrenBarn
BrenBarn,这正是我想要确定的。我可能遇到的唯一限制是变量“服务器请求数过多,所以告诉你去死”。但在发生错误的情况下,我等待3秒钟应该已经足够了。因此,我不确定requests.get()是否会暂停脚本直到收到响应,或者其他原因。 - CHP
有趣的是,我正在使用Python3,但也在Windows上。我在某个地方读到,time.sleep(0)等待10-13毫秒,这应该比我的限制要大得多。不过,当我回家后,我仍然会尝试1./250。 - CHP
1个回答

21

requests.get函数是一个阻塞调用,会等待响应到达后再执行程序的其余部分。如果您想要能够同时执行其他操作,可能需要查看asynciomultiprocessing模块。


1
你没有在循环内重复使用 request.get。因此,如果第一次失败,你的程序将永远循环下去(在循环之间休眠)。 - Chad S.
我遇到了错误,复制/粘贴代码时可能没有选择那部分代码。已经修复,谢谢。 - CHP
我会接受这个答案,因为它包含了我正在寻找的部分答案,而另一部分答案则由API主机回答。事实证明,我没有遇到速率限制,但是有一些变量速率限制被设置以防止服务器过载,正如问题的评论中所建议的那样。 - CHP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接