我在Raspberry Pi板上使用Python和Rasbian OS(基于Linux)。我的Python脚本使用GPIO(硬件输入)。我注意到当GPIO激活时,它的回调会中断当前线程。
这迫使我使用锁来防止线程访问公共资源时出现问题。然而它变得有点复杂。让我感到震惊的是,如果GPIO在主线程进入睡眠状态之前“排队”(例如点击time.sleep
),它会大大简化(例如javascript处理事物的方式)。
有没有办法在Python中实现它?
答案 0 :(得分:1)
使用多线程模块中的队列来存储要执行的任务。主循环定期检查队列中的条目,并在找到某些内容时逐个执行。
您的GPIO监控线程将他们的任务放入队列(只需要一个从多个线程收集)。
您可以将任务建模为可调用对象或函数对象。
答案 1 :(得分:1)
您使用的是RPi.GPIO library
吗?或者在回调触发时从C调用Python代码?
如果是RPi.GPIO
,它会运行一个有效的Python线程,如果正确组织线程交互,则不需要额外的同步。
最常见的模式是将您的事件放入队列中(如果Python 3 this library将执行此任务,则Python 2具有this one)。然后,当主线程准备好处理事件时,处理队列中的所有事件。唯一的问题是你如何找到处理它们的时刻。最简单的解决方案是实现一个功能,并不时调用它。如果您使用长sleep
次呼叫,则可能必须将其拆分为许多较小的睡眠,以确保经常处理外部事件。您甚至可以为sleep
实现自己的包装器,将一个大延迟拆分为几个较小的延迟并处理它们之间的队列。另一个解决方案是使用带有Queue.get
参数的timeout
而不是sleep
(它会在事件到达队列后立即返回),但是,如果您需要准确睡眠一段时间,指定的,您可能需要做一些额外的魔术,例如自己测量时间并在处理事件后需要等待更多时再次调用get
。