用了requests库,爬取了一晚上,程序在某个页面hang住了,没有任何报错信息,也不退出,也不前进,日志和进程查不出问题。
操作回顾:
查看nohup.out,无任何异常数据;
查看程序log,在183页有数据,184页数据未出现;
ps aux |grep 查看进程,未占用大量cpu和内存,排除死循环;
查看代码,未使用多线程多进程,排除死锁;
查看问题进程打开的文件,lsof -p xx,发现最后打开的文件是建立了2个tcp连接,并且一直未断开,考虑io阻塞的可能性;
再次查看代码,设置了io连接重试,未设置连接超时,但自己一直以为requests库有默认超时,故不得其解;
再次lsof查看,跟进lsof -i:port看建立的是什么连接端口,发现是https
网上搜索requests库超时重试问题,得到下面一句话:
读取超时是没有默认值的,如果不设置,程序将一直处于等待状态
豁然开朗!
一直以为的默认超时是连接超时,默认2s,并且session中通过adapter设置的retry重试也是简单的默认针对连接超时超时,除非使用Retry对象详细指定超时机制。
解决方法: