这篇文章是基于上篇文章的续章~
一台机器要部署很多爬虫,每天定时执行的情况下,服务器CPU和内存占比较高的情况出现后
模拟一份代码,进行分析。
一个简单的爬虫程序,爬取10页数据共计150条,每天定时写入数据库
总共不到150行,没运行期间内存已经20%多了,运行期间内存会涨到60%,CPU会涨到40%左右
一个简单程序如此高的消耗肯定是有问题的,参考了网上的一些文章
有使用工具的,安装第三方包的,写时间判断的等等
但是对我的帮助不大(windows....)
努(带)力(薪)工(拉)作(*)之后,根据看过的文章思考了一番: 1.内存和CPU高代表着程序当中的部分代码在大量或反复的执行 2.爬取的时间3-4秒,写入MYSQL数据库,解析使用的XPATH, 保存数据使用的单表,索引只有ID和URL,表结构数据长度都合适 3.使用了线程,线程数4个 4.没有文件读写操作,网络请求较快,对方服务器响应较快 5.使用了schedule定时模块 6.对后台接口进行任务轮询和定时模块当中出现了while True
还有文章提到判断导入的模块是否时c写的,导致底层频繁调用,首先这个说法不说对不对...一是不会看,二是看了不也得用这个模块吗 所以不考虑这种情况 1.部分代码在大量或反复的执行,具体是哪里差找起来不方便,可以放在最后进行过滤 2.时间短,执行结束return,应该不存在变量未回收的情况;数据量不大,写入MySQL应该没问题; XPATH解析数据很快,网页结构并不复杂;单表保存,不涉及到复杂逻辑,索引ID为了自增,URL为了去重,数据量少, 数据表的长度戳戳有余,应该也不是这里; 3.线程使用ThreadPoolExecutor,workers = 4,数量不多 4.没有文件读写,网络请求正常 5.定时模块的while True和任务轮询的while True
思考一番之后,情况1和情况5似乎有重叠的部分,于是看了下任务轮询
每隔半分钟进行一次查询,查询到了便把相关设置传入定时任务中,抱着不放过任何一个可疑代码块的精神
单独把query_task()拿出来进行测试,CPU占比不到1%,内存占比不到2%
那么就可能是定时模块的问题
进入定时之后就会在每天早上7点执行,应该也是没问题的
那么schedule.run_pending()就显得非常有问题,简单粗暴的下面添加个print(111)看看情况
简直是疯狂输出1111...
接下来添加个time.sleep(10)看看效果
可以看到python的CPU已经降下来了(不要问我为什么不见那个testss文件,但是pycharm下后面写的是4)
内存仍然大可以试试在cmd中执行python文件看看效果,不使用pycharm
所以代码的问题就在定时任务中的while true的地方
后面会试着把schedule换成APS,如果还有类似的问题再说~
以上仅代表个人调试经验
文章有不对的地方欢迎大佬批评指正,我也是第一次调这个东西~