• 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,如果还有类似的问题再说~

     以上仅代表个人调试经验

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

    自有风云来时雨, 似有风霜沾蓑衣
  • 相关阅读:
    CSS hack
    字符串中常用的方法
    排序算法
    拾遗
    数组类型检测
    数组常用的方法
    go 文件服务器(标准库) 添加关机,睡眠,退出功能
    go cmd 交互 初始化执行某些命令
    go 内网IP及外网IP获取
    go 快排实现
  • 原文地址:https://www.cnblogs.com/meipu/p/14372817.html
Copyright © 2020-2023  润新知