在Python 2.4中定时urllib2 urlopen操作

时间:2012-02-16 13:39:01

标签: python timer timeout urllib2 python-2.4

我刚刚继承了一些Python代码,需要尽快修复bug。 我的Python知识很少,所以请原谅我的无知。 我正在使用urllib2从网页中提取数据。 尽管使用socket.setdefaulttimeout(30),我仍然会看到无限期挂起的网址。

我希望将提取时间缩短,并且经过多次网络搜索后才能实现这一目标:

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操作。

我们将非常感激地收到任何指导。 ç

更新------------------------- 根据我在某些URL上使用的经验,urllib2.urlopen会挂起并无限期地等待。 执行此操作的URL是指向浏览器时从未解析的URL,浏览器只是等待活动指示器移动但从未完全连接。 我怀疑这些URL可能会陷入某种无限循环重定向。 urlopen的超时参数(在更高版本的Python中)和socket.setdefaulttimeout()全局设置不会在我的系统上检测到此问题。

我尝试了很多解决方案,但最后我更新了Python 2.7并使用了Werner的答案变体。谢谢Werner。

2 个答案:

答案 0 :(得分:2)

就在那里in the function

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

e.g:

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

答案 1 :(得分:2)

您可以使用信号实现此目的。

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

聚苯乙烯。不确定这在语法上是否正确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'