Python是等待输入的最有效方法

时间:2015-07-08 21:05:02

标签: python raspberry-pi

我有一个python程序,我想在后台运行(在Raspberry Pi上)等待GPIO输入然后执行操作并继续等待输入,直到进程被终止。

实现这一目标的最有效方法是什么。我的理解是,使用while true并不是那么有效。理想情况下它会使用中断 - 我可以使用GPIO.wait_for_edge - 但这需要在某个循环中或在处理程序完成后继续操作的方式。

由于

2 个答案:

答案 0 :(得分:1)

根据:http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio GPIO.wait_for_edge(23,GPIO.FALLING)将使用中断而不是轮询等待引脚23上的转换。它只会在触发时继续。您可以将它包含在try:/中,除了KeyboardInterrupt以捕获ctrl-c。

如果要继续处理,则应为中断注册回调函数。请参阅:http://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

def callback(channel):
   do something here

GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)
continue your program here, likely in some sort of state machine

答案 1 :(得分:1)

据我所知,当你说“正确使用”时,你指的是民意调查, 这是在某个时间间隔检查gpio状态以进行检测 改变,以牺牲一些处理时间为代价。

避免轮询的一种替代方法(来自docs)是wait_for_edge():

  

wait_for_edge()函数用于阻止程序的执行   直到检测到边缘。

这似乎是你在找什么;该计划将暂停 使用epool() IIUC执行。

现在假设你意味着你不想使用GPIO.wait_for_edge() 因为您不希望在处理时丢失GPIO状态更改 事件,你需要使用线程。一种可能的解决方案是投入 Queue中的事件和设置:

  • 执行while True: queue.put(GPIO.wait_for_edge(...))
  • 的一个主题
  • 执行Queue.get()
  • 的另一个主题