Python 2.4中的urllib2 urllopen操作超时



我刚刚继承了一些Python代码,需要尽快修复一个错误。我对Python知之甚少,请原谅我的无知。我正在使用urllib2从网页中提取数据。尽管使用了socket.setdefaulttimeout(30),我仍然会遇到似乎无限期挂起的URL。

我想暂停提取,并在网上搜索了这么多之后已经走了这么远:

import socket 
socket.setdefaulttimeout(30)
reqdata = urllib2.Request(urltocollect)
    def handler(reqdata):
        ????  reqdata.close() ????

    t = Timer(5.0, handler,[reqdata])
    t.start()
    urldata = urllib2.urlopen(reqdata)
    t.cancel()

处理程序函数在时间过去后触发,但我不知道如何让它停止openurl操作。

如有任何指导,我们将不胜感激。C

更新-------------------------根据我的经验,当在某些URL上使用urllib2.urlopen时,它会挂起并无限期等待。这样做的URL在浏览器指向时永远不会解析,浏览器只是在活动指示器移动的情况下等待,但永远不会完全连接。我怀疑这些URL可能被卡在某种无限循环重定向中。urlopen的timeout参数(在Python的更高版本中)和socket.setdefaulttimeout()全局设置在我的系统上没有检测到这个问题。

我尝试了很多解决方案,但最终我升级到了Python 2.7,并使用了下面Werner答案的变体。谢谢沃纳。

您可以使用信号来实现这一点。

下面是我的信号装饰器的一个示例,您可以使用它来设置单个函数的超时。

Ps。不确定这在2.4的语法上是否正确。我使用的是2.6,但2.4支持信号。

import signal
import time
class TimeOutException(Exception):
    pass
def timeout(seconds, *args, **kwargs):
    def fn(f):
        def wrapped_fn(*args, **kwargs):
            signal.signal(signal.SIGALRM, handler)
            signal.alarm(seconds)
            f(*args, **kwargs)
        return wrapped_fn
    return fn
def handler(signum, frame):
    raise TimeOutException("Timeout")
@timeout(5)
def my_function_that_takes_long(time_to_sleep):
    time.sleep(time_to_sleep)
if __name__ == '__main__':
    print 'Calling function that takes 2 seconds'
    try:
        my_function_that_takes_long(2)
    except TimeOutException:
        print 'Timed out'
    print 'Calling function that takes 10 seconds'
    try:
        my_function_that_takes_long(10)
    except TimeOutException:
        print 'Timed out'

它就在函数中。

urllib2.urlopen(url[, data][, timeout])

例如:

urllib2.urlopen("www.google.com", data, 5)

相关内容

  • 没有找到相关文章

最新更新