在Python中,如何对有时挂起的函数调用强制执行超时?

时间:2011-12-27 22:09:48

标签: python timeout urllib2 python-2.6 hang

我正在使用Python蜘蛛使用urllib2 OpenerDirector抓取互联网。问题是连接将不可避免地挂在https地址上,显然忽略了超时值。

一种解决方案是在线程中运行它然后杀死并重新启动线程(如果它挂起)。显然Python不支持杀死线程,因为垃圾收集和其他问题,它被认为是一个坏主意。然而,由于简单,这种解决方案对我来说是优选的。

另一个想法是使用像Twisted这样的异步库,但这并不能解决问题。

我需要一种方法来强制中断调用或修复urllib2 OpenerDirector处理超时的方式。感谢。

2 个答案:

答案 0 :(得分:2)

另一个StackOverflow问题类似于here。当我遇到类似的东西时,我发现将我正在做的事情转换为定义&更容易调用函数,随后可以在超时事件时返回一个值。这实际上可以通过利用各种返回值来开辟更多可能性。

我上面链接的相关问题的另一个答案听起来更像你正在寻找的东西(据我理解):https://stackoverflow.com/a/5817436/1118357

答案 1 :(得分:0)

我建议使用另一个进程而不是线程。像这样:

from multiprocessing import Process

checker = Process(target=yourFunction, args=(some_queue))
timeout = 150
checker.start()
counter = 0
while checker.is_alive() == True:
        time.sleep(1)
        counter += 1
        if counter > timeout :
                print "Son process consumed too much run-time. Going to kill it!"
                kill(checker.pid)
                break
无论如何,儿子进程在150秒后被杀死。