Python脚本占用cpu太多

Python脚本占用cpu太多,python,python-2.7,cpu-usage,raspbian,raspberry-pi2,Python,Python 2.7,Cpu Usage,Raspbian,Raspberry Pi2,我不是一个编程专家,所以我在谷歌上搜索了很多东西来让这个脚本工作。它在串行接口上侦听ans正在搜索3个值(温度、湿度和电池电量)。如果找到一个zhem,它会将其保存到文本文件中,并检查该值是否高于或低于某个级别。如果是这种情况,它会发送电子邮件发出警告 我的问题是,它持续使用大约99%的cpu功率。。。 你能帮我把CPU的使用限制到最低限度吗 谢谢 #!/usr/bin/env python # -*- coding: utf-8 -*- import serial import time

我不是一个编程专家,所以我在谷歌上搜索了很多东西来让这个脚本工作。它在串行接口上侦听ans正在搜索3个值(温度、湿度和电池电量)。如果找到一个zhem,它会将其保存到文本文件中,并检查该值是否高于或低于某个级别。如果是这种情况,它会发送电子邮件发出警告

我的问题是,它持续使用大约99%的cpu功率。。。 你能帮我把CPU的使用限制到最低限度吗

谢谢

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import serial
import time
import sys
import smtplib
from time import sleep

def mail(kind, how, value, unit):
    fromaddr = 'sender@domain.com'
    toaddrs  = 'recipient@domain.com'
    msg =  "\r\n".join([
    "From: sender",
    "To: recipient",
    "Subject: Warning",
    "",
    "The " + str(kind) + " is too " + str(how) + ". It is " + str(value) + str(unit)
    ])
    username = 'user'
    password = 'password'
    server = smtplib.SMTP('server:port')
    server.ehlo()
    server.starttls()
    server.login(username,password)
    server.sendmail(fromaddr, toaddrs, msg)
    server.quit()

def main():

        port = '/dev/ttyAMA0'
        baud = 9600

        ser = serial.Serial(port=port, baudrate=baud)

        sleep(0.2)    

        while True:
            while ser.inWaiting():
                # read a single character
                char = ser.read()
                # check we have the start of a LLAP message
                if char == 'a':
                # start building the full llap message by adding the 'a' we have
                llapMsg = 'a'
                # read in the next 11 characters form the serial buffer
                # into the llap message
                llapMsg += ser.read(11)


        if "TMPB" in llapMsg:
            TMPB = llapMsg[7:]
            with open("TMPB.txt", "w") as text_file:
                text_file.write(TMPB)
                if float(TMPB) >= 19:
                    mail("temperature", "high", TMPB, "°C")
                elif float(TMPB) <= 15:
                    mail("temperature", "low", TMPB, "°C")
                else:
                    pass

        elif "HUMB" in llapMsg:
            HUMB = llapMsg[7:]
            with open("HUMB.txt", "w") as text_file:
                text_file.write(HUMB)
                if float(HUMB) >= 80:
                    mail("humidity", "high", HUMB, "%")
                elif float(HUMB) <= 70:
                    mail("humidity", "low", HUMB, "%")
                else:
                    pass

        elif "BATT" in llapMsg:
            BATT = llapMsg[7:11]
            with open("BATT.txt", "w") as text_file:
                text_file.write(BATT)
                if float(BATT) < 1:
                    mail("battery level", "low", BATT, "V")
                else:
                    pass

        sleep(0.2)

if __name__ == "__main__":
        main()
#/usr/bin/env python
#-*-编码:utf-8-*-
导入序列号
导入时间
导入系统
导入smtplib
从时间上导入睡眠
def邮件(种类、方式、价值、单位):
fromaddr=sender@domain.com'
地址:recipient@domain.com'
msg=“\r\n”。加入([
“发件人:,
“收件人:收件人”,
“主题:警告”,
"",
“+str(种类)+”太“+str(如何)+”。它是“+str(值)+str(单位)
])
用户名='user'
密码='password'
server=smtplib.SMTP('服务器:端口')
server.ehlo()
server.starttls()
server.login(用户名、密码)
sendmail(fromaddr,toaddrs,msg)
server.quit()
def main():
端口='/dev/ttyam0'
波特率=9600
ser=串行。串行(端口=端口,波特率=波特率)
睡眠(0.2)
尽管如此:
当ser.inWaiting()时:
#读一个字符
char=ser.read()
#检查是否有LLAP消息的开始
如果char==“a”:
#通过添加“a”开始构建完整的llap消息
llapMsg='a'
#从串行缓冲区读入接下来的11个字符
#进入llap消息
llapMsg+=序列读取(11)
如果llapMsg中的“TMPB”:
TMPB=llapMsg[7:]
打开(“TMPB.txt”、“w”)作为文本文件:
text_file.write(TMPB)
如果浮动(TMPB)>=19:
邮件(“温度”、“高”、TMPB、“摄氏度”)
elif浮动(TMPB)=80:
邮件(“湿度”、“高”、HUMB、%”)

我自己解决了这个问题

while ser.inWaiting():
循环导致了沉重的cpu负载。 我删除了它,并纠正了压痕,它的工作与几个%的cpu负载伟大


感谢您的提示,它帮助我解决了问题。

您的缩进是否正确复制到问题中,否则这本身可能就是错误。另外,您是否检查了
ser.inWaiting()
是否总是正确的,因此,保持在while循环中?@agold缩进与此完全相同,并且有效。它应该保持在循环中,因为串行端口上的数据大约每5分钟出现一次,因此它必须不断地侦听串行接口。我没有时间浏览程序,但这里有一些东西要看:(1)确保使用最小采样率,(2)始终使用睡眠API在采样之间等待,(3)从不忙循环。CPU使用率高的一个最常见原因是过度采样。@TaylorKidd感谢您的帮助。我正试图相应地修改脚本。