使用ecxeption(Python-Raspberry-Raspian)代码会变慢

2024-05-14 23:27:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我制作了一个程序,在网上收集气象信息,当用户按下按钮时打印出来。我用函数add\u event\u detect from Rpio.GPIO制作了一个新版本的程序,但是程序变得非常慢

我用的是覆盆子Pi3B+和覆盆子酱

我的程序例外是:

def init():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
    GPIO.add_event_detect(5, GPIO.RISING, callback=bouton_presse, bouncetime=500)

def bouton_presse(channel):
    start_time = time.time()
    print "Bouton presse"
    try:
        print "Connexion"
        req=requests.get('http://www.meteo-paris.com/')
        print "Connexion reussi"
        print "Traitement du fichier html"
        soup = BeautifulSoup(req.text, 'html.parser')
        print "Soup cree"
        print "Extraction de l'information"
        elt=soup.find("div", { "class" : "bloc_aujourdhui_pluie_texte" })
        print "Info extraite"
        print "Formattage du texte"
        pourcent=elt.span.string
        print "Texte formatte"
        pluie=float(pourcent[:-1])/100
        print "pluie:",pluie
        rcol=int((1-pluie)*255)
        vcol=int(0.5*(1-pluie)*255)
        bcol=int(pluie*255)
    except:
        print "Erreut de connexion"
        rcol,vcol,bcol=255,0,0
    print "Couleurs:",rcol,vcol,bcol
    setRGB(rcol,vcol,bcol)
    print("--- %s seconds ---" % (time.time() - start_time))
    time.sleep(5)
    rcol,vcol,bcol=0,0,0
    print "Extinction"
    setRGB(rcol,vcol,bcol)


if __name__ == '__main__':
    try:
        init()
        while True:
            pass
    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    GPIO.cleanup()
    sys.exit(0)

没有:

def init():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) 

def bouton_presse():
    start_time = time.time()
    print "Bouton presse"
    try:
        print "Connexion"
        req=requests.get('http://www.meteo-paris.com/')
        print "Connexion reussi"
        print "Traitement du fichier html"
        soup = BeautifulSoup(req.text, 'html.parser')
        print "Soup cree"
        print "Extraction de l'information"
        elt=soup.find("div", { "class" : "bloc_aujourdhui_pluie_texte" })
        print "Info extraite"
        print "Formattage du texte"
        pourcent=elt.span.string
        print "Texte formatte"
        pluie=float(pourcent[:-1])/100
        print "pluie:",pluie
        rcol=int((1-pluie)*255)
        vcol=int(0.5*(1-pluie)*255)
        bcol=int(pluie*255)
    except:
        print "Erreut de connexion"
        rcol,vcol,bcol=255,0,0
    print "Couleurs:",rcol,vcol,bcol
    setRGB(rcol,vcol,bcol)
    print("--- %s seconds ---" % (time.time() - start_time))
    time.sleep(5)
    rcol,vcol,bcol=0,0,0
    print "Extinction"
    setRGB(rcol,vcol,bcol)  


if __name__ == '__main__':
    try:
        init()
        while True:
            if GPIO.input(5)==GPIO.HIGH:
                bouton_presse()

    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    GPIO.cleanup()
    sys.exit(0)

如果没有add\u event\u detect,需要0.4秒;如果没有add\u event\u detect,需要2秒。我更喜欢使用exception,但是2s太长了!问题出在哪里


Tags: 程序eventaddgpiotimedefintprint
1条回答
网友
1楼 · 发布于 2024-05-14 23:27:09

为了找出这个项目的花费时间,我建议如下:

def init():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
    GPIO.add_event_detect(5, GPIO.RISING, callback=bouton_presse, bouncetime=500)

def bouton_presse(channel):

    start_time = time.time()

    print "Bouton presse"
    try:
        print "Connexion"
        req=requests.get('http://www.meteo-paris.com/')

        req_time = time.time()

        print "Connexion reussi"
        print "Traitement du fichier html"
        soup = BeautifulSoup(req.text, 'html.parser')

        soup_time = time.time()

        print "Soup cree"
        print "Extraction de l'information"
        elt=soup.find("div", { "class" : "bloc_aujourdhui_pluie_texte" })
        print "Info extraite"
        print "Formattage du texte"
        pourcent=elt.span.string
        print "Texte formatte"
        pluie=float(pourcent[:-1])/100
        print "pluie:",pluie
        rcol=int((1-pluie)*255)
        vcol=int(0.5*(1-pluie)*255)
        bcol=int(pluie*255)

    except:
        print "Erreut de connexion"
        rcol,vcol,bcol=255,0,0

    print "Couleurs:",rcol,vcol,bcol
    setRGB(rcol,vcol,bcol)

    end_time = time.time()

    print "  - times   -"
    print "request: %s" % (req_time - start_time)
    print "parsing: %s" % (soup_time - req_time)
    print "total  : %s" % (end_time - start_time)

    time.sleep(5)
    rcol,vcol,bcol=0,0,0
    print "Extinction"
    setRGB(rcol,vcol,bcol)


if __name__ == '__main__':
    try:
        init()
        while True:
            pass
    except KeyboardInterrupt:
        print "Shutdown requested...exiting"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    GPIO.cleanup()
    sys.exit(0)

一般来说,这类回调应该短而快。相反,bouton_presse()发出一个http请求并休眠5秒钟。通常,回调会设置一个全局标志,当设置了该标志时,主循环会执行一些操作

timestamp = 0

def callback(channel):
   global timestamp
   timestamp = time.time()

def main():
    prevstamp = 0

    while True:
       # if timestamp is newer, the callback must have run
       if timestamp > prevstamp:

           # handle the event
           do_something()

           # reset  
           prevstamp = timestamp

相关问题 更多 >

    热门问题