我制作了一个程序,在网上抓取流星信息,并在用户按下按钮时打印出来。我用add_event_detect函数从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_event_detect,它需要0.4s,而对于add_event_detect,它需要2s。我更喜欢使用异常,但是2s太长了!问题出在哪里?
发布于 2019-09-20 01:42:25
为了找出这个项目花在哪里的时间,我建议如下:
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 = timestamphttps://stackoverflow.com/questions/58018318
复制相似问题