2015-11-28 2 views
0

Я не специалист в программировании, поэтому я много искал, чтобы заставить этот скрипт работать. Он прослушивает последовательный интерфейс и ищет 3 значения (температура, влажность и уровень заряда батареи). Если он найдет один из zhem, он сохранит его в текстовом файле и проверяет, находится ли значение выше или ниже определенного уровня. В этом случае он отправляет электронное письмо для предупреждения.Python script too much cpu usage

Моя проблема в том, что он использует constatntly около 99% мощности процессора ... Можете ли вы помочь мне ограничить использование ЦП до минимума.

Благодаря

#!/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 = '[email protected]' 
    toaddrs = '[email protected]' 
    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() 
+0

Правильно ли скопирован ваш отступ в вопрос, иначе это может быть ошибкой. И проверили ли вы, если 'ser.inWaiting()' может быть всегда истинным и, следовательно, оставаться в цикле while? – agold

+0

@ agold Отступ точно такой, и он работает. Он должен оставаться в цикле, потому что данные в последовательном порту появляются каждые 5 минут, поэтому он должен постоянно слушать последовательный интерфейс. – CrazyAndy

+0

У меня нет времени, чтобы заглянуть в программу, но вот некоторые вещи, на которые нужно обратить внимание: (1) убедитесь, что вы используете минимальную частоту дискретизации, (2) всегда используйте API сна для ожидания между выборками и (3) никогда цикл занятости. Одной из наиболее распространенных причин очень высокой загрузки процессора является выборка. –

ответ

0

Я решил вопрос сам.

Петля while ser.inWaiting(): вызывает тяжелую нагрузку процессора. Я удалил его и исправил отступы, и он отлично работает с нагрузкой в ​​несколько процентов.

Спасибо за ваши подсказки, это помогло мне решить проблему.