我正在使用Python蜘蛛使用urllib2 OpenerDirector抓取互联网。问题是连接将不可避免地挂在https地址上,显然忽略了超时值。
一种解决方案是在线程中运行它然后杀死并重新启动线程(如果它挂起)。显然Python不支持杀死线程,因为垃圾收集和其他问题,它被认为是一个坏主意。然而,由于简单,这种解决方案对我来说是优选的。
另一个想法是使用像Twisted这样的异步库,但这并不能解决问题。
我需要一种方法来强制中断调用或修复urllib2 OpenerDirector处理超时的方式。感谢。
答案 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秒后被杀死。