繁体   English   中英

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

[英]Skip an iteration if time limit exceeds PYTHON

我正在为我的项目使用请求库中的代理,具体取决于所使用的代理,每个请求花费不同的时间(不可预测的时间)。

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

如果某个请求花费的时间超过了某个时间,我想跳过它,转到下一个请求。该怎么办?
编辑:使用超时参数会引发一个异常。当然,我可以通过异常处理来完成我的工作。但是我希望从更一般的意义上讲。例如,如果我不谈论请求该怎么办..假设有一个语句的时间无法预定义?! 有什么方法可以进行下一个迭代吗?

在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 )后SIGALRM 您当然可以调整时间限制。

您而言,就我所知,您可以使用timeout参数。 文档所述

您可以使用timeout参数在给定的秒数后告诉请求停止等待响应。 几乎所有生产代码都应在几乎所有请求中使用此参数。 否则,可能会导致您的程序无限期挂起[...]

所以你的代码最终看起来像

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

(超时参数以秒为单位。)

例如,将timeout=10添加到您的post通话中。

r = requests.post(url, proxies=proxy, data=payload, timeout=10)

您可以自己通过help(requests.post)或通过查看文档来回答问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM