如果时间限制超过PYTHON,则跳过迭代

时间:2017-07-06 15:36:17

标签: python windows python-3.x

我在我的项目的请求库上使用代理。根据使用的代理,每个请求都需要不同的(不可预测的)时间。

for proxy in proxyList:
    r=requests.post(url, proxies=proxy, data=payload)

如果某个请求需要的时间超过一定时间,我想跳过它并转到下一个请求。如何做到这一点?
编辑:使用超时参数引发异常。当然,我可以通过异常处理完成我的工作。但是我想要它在更一般的意义上......就像我不是在谈论请求的那样...假设有声明其时间不能预先定义?!有没有办法继续下一次迭代?

2 个答案:

答案 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