我在我的项目的请求库上使用代理。根据使用的代理,每个请求都需要不同的(不可预测的)时间。
for proxy in proxyList:
r=requests.post(url, proxies=proxy, data=payload)
如果某个请求需要的时间超过一定时间,我想跳过它并转到下一个请求。如何做到这一点?
编辑:使用超时参数引发异常。当然,我可以通过异常处理完成我的工作。但是我想要它在更一般的意义上......就像我不是在谈论请求的那样...假设有声明其时间不能预先定义?!有没有办法继续下一次迭代?
答案 0 :(得分:1)
在Mac / UNIX系统上,您可以在一段时间后引发自定义异常,如下所示:
import signal
class TimeoutException(Exception): # custom exception
pass
def timeout_handler(signum, frame): # raises exception when signal sent
raise TimeoutException
# Makes it so that when SIGALRM signal sent, it calls the function timeout_handler, which raises your exception
signal.signal(signal.SIGALRM, timeout_handler)
# Start the timer. Once 5 seconds are over, a SIGALRM signal is sent.
for proxy in proxyList:
signal.alarm(5)
try:
r=requests.post(url, proxies=proxy, data=payload)
except TimeoutException:
pass
基本上,您创建了一个自定义的异常,该异常是在时间限制结束后(即发送SIGALRM
)引发的。你当然可以调整时间限制。
更简单在你的情况下,你可以使用timeout参数,据我所知。正如documentation所说:
您可以使用timeout参数告知请求在给定秒数后停止等待响应。几乎所有生产代码都应该在几乎所有请求中使用此参数。如果不这样做会导致您的程序无限期挂起[...]
所以你的代码最终看起来像
for proxy in proxyList:
r=requests.post(url, proxies=proxy, data=payload, timeout=1)
(超时参数以秒为单位。)
答案 1 :(得分:1)
将timeout=10
(例如)添加到post
来电。
r = requests.post(url, proxies=proxy, data=payload, timeout=10)
您可以自己回答问题,例如help(requests.post)
或查看documentation。