最近在改一个python写的爬虫代码,多线程并行爬取,发现程序的线程会莫名其妙的消失掉也不抛异常,于是仔细研读了代码,确定所有的模块都return后,问题仍然得不到解决,最后通过调试发现消失掉的线程会卡在如下语句:
response = urllib2.urlopen(req)
百思不得其解,察看官方文档后才知道原来urllib2中的urlopen还有另外两个可选参数,定义如下:
urllib2.urlopen(url[, data][, timeout]),细节请看http://docs.python.org/2/library/urllib2.html
关键是第三个timeout参数,如果没有设置则线程一旦碰见网络情况糟糕,则会出现无限等待的情况,因而导致线程“消失”。
作如下修改:
response = urllib2.urlopen(req,None,10)
10s超时后,抛出异常,线程继续。