Python 程序运行时CPU和内存高解决思路

这篇文章是基于上篇文章的续章~

一台机器要部署很多爬虫,每天定时执行的情况下,服务器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,如果还有类似的问题再说~

 以上仅代表个人调试经验

 文章有不对的地方欢迎大佬批评指正,我也是第一次调这个东西~

posted @ 2021-02-04 15:24  黑山老道  阅读(9908)  评论(0编辑  收藏  举报