【python while函数 资源占用】你以为只是8点执行一下,可曾想过背后的时刻奔波

先交代下故事背景:

用python编写了两个数据采集的相关程序,一个程序是基于modbus_tcp协议不间断采集秒级数据存到数据库,另一个程序是每天8点执行一下,将昨天采集的秒级数据转换为分钟级数据再存入数据库另一个表。

某天,A服务器(windows)的信仰崩塌,不运行了,所以我一顿移山倒海,把这俩程序挪到B服务器(Centos)上运行;又有一天,B服务器负责人过来惊呼:是你装的python吗?是你跑的python程序吗?我的天哪,它的CPU占用率99.8%了!

什么,一个linux高性能服务器的CPU占用率达到了99%,我还有这个奇异功能?

秒级数据不间断采集程序,采集三个设备的数据,存至两个方向的数据库,使用了三个进程。莫非它太耗时了?

 

故事读完了,该排查了问题了啊喂。

第一步:把这两程序在windows上重新跑一下,看看资源占用率,秒级数据采集程序占用5%,秒级转分钟级存储程序占用12%,咦,看着不高呀;

第二步:停掉centos服务器B上的秒级数据采集程序,查看服务器B的CPU占用率,还是高居不下;

第三步:停掉centos服务器B上的秒级转分钟级存储的程序,再次查看服务器B上的CPU占用率,哇塞,银河落九天,CPU消停了。

 虽然不知道为什么window上和linux上差别巨大(期待以后有一天可以弄明白),却大概聚焦了问题的方向,是的,问题就在秒级转分钟级存储程序上,是它是它就是它。

 

解决问题。

一般占用资源比较多的是带有while的语句,但是我的只是每天早上八点执行以下,怎么会这么占资源呢?

回归程序,看看模块(modbus_tcp_to_db_min_level.py)代码,贴上证据:

import time

while True:
    time_now=time.strftime("%H:%M:%S", time.localtime())
    if time_now == "08:00:00":
       xxxxxx(具体执行部分)

嚯,好家伙,原来每时每刻服务器都没歇着,每时每刻获取当前时刻的时间,还拿它与八点这一时刻进行比较,哎呀,有没有到八点嘛,还木有啊,好吧,那我再回去问下服务器当前时间。

 

明明一天只需要劳动一次,却时时刻刻累得半死,为了解决,去掉while这个永动机,改为定时器操作。

1、在命令行里输入指令crontab -e,进入vim编辑模式

2、输入的内容为 0 8 * * * python /home/collect_data_roof/modbus_tcp_to_db_min_level.py,模式即为定时规则+python+模块所在路径+需要定时运行的模块,如颜色区分。

3、使用指令crontab -l,查看定时任务,完成。

 4、python程序中的print()中的打印内容,在服务器上/var/spool/mail路径下的root文件上查看。

为什么要写这篇日志呢?

是的,我们写代码的时候,有时候为了实现功能,不择手段,功能实现了,哎呀,我搞出来了,我可以下班了!那能不能再往前走一步稍稍思考下呢,我这样写会不会有什么不妥,这样写会不会时刻在耗费资源,除了这种方法,有没有另一种方法,能实现同样的目的?这篇代码就是很好的一个反例。

 

延伸

那么问题来了,linux下的crontab定时器又是基于什么原理呢?为什么人家的定时程序就能很好地不占用资源呢?crontab又有没有什么缺点呢?

 

 追加:可能crontab是系统自带的功能,在资源调度优化方面更好些;可能程序本身的获取当前时间函数虽然看起来只是一行代码,但这个函数本身背后的逻辑处理却很多,也可能这个函数占用了内存消耗,等等,如果你知道答案,感谢评论区见。

posted @ 2020-08-18 19:20  虾米堡  阅读(509)  评论(0)    收藏  举报