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



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

一个解决方案是在线程中运行它,然后在它挂起时杀死并重新启动线程。显然,Python不支持杀死线程,由于垃圾收集和其他问题,它被认为是一个坏主意。然而,我更喜欢这个解决方案,因为它很简单。

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

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

另一个StackOverflow问题与此类似。当我遇到类似的事情时,我发现把我正在做的事情转换成定义"&调用函数,这些函数随后可以在超时事件时返回一个值。这实际上可以通过使用各种返回值来打开更多的可能性。

我上面提到的相关问题的另一个答案听起来更像你正在寻找的(据我所知):https://stackoverflow.com/a/5817436/1118357

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

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秒后被终止。

相关内容

  • 没有找到相关文章