首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ecxeption,代码会变慢( Raspian)

使用ecxeption,代码会变慢( Raspian)
EN

Stack Overflow用户
提问于 2019-09-19 20:09:16
回答 1查看 41关注 0票数 0

我制作了一个程序,在网上抓取流星信息,并在用户按下按钮时打印出来。我用add_event_detect函数从Rpio.GPIO制作了一个新版本的程序,但是程序变得非常慢。

我用的是拉斯宾的覆盆子Pi3B+。

我的程序例外是:

代码语言:javascript
复制
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)

而且没有:

代码语言:javascript
复制
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_event_detect,它需要0.4s,而对于add_event_detect,它需要2s。我更喜欢使用异常,但是2s太长了!问题出在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-20 01:42:25

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

代码语言:javascript
复制
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秒。通常,回调设置全局标志,主循环在设置标志时采取一些操作。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58018318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档