我正在编写一些与真实世界的硬件接口的python代码。它正在取代硬件PLC。我正在计划的是,当一个事件触发器碰巧启动多个线程来实现某些“打开”操作,然后进入睡眠一段固定的时间间隔,然后执行相应的“关闭”操作。例如:触发时,产生一个线程来打开房间的灯光。然后入睡20分钟。然后关掉灯并终止线程。
但是,在某些情况下会再次发生事件触发器。在那种情况下,我希望整个序列重新开始。我最初的计划是使用具有唯一名称的线程,因此如果发生触发器,请检查“ lights”线程是否存在,如果确实杀死了它,然后重新生成一个新的“ lights”线程。但是在研究这些部分时,似乎有人建议杀死线程是一件很不好的事情。
那么,处理我的情况的更好的方法是什么?请注意,在我的示例中,我只谈论了一个线程,但实际上,将有许多不同的线程来控制许多不同的设备。
这是运行raspbian的Rapberry Pi上的python 3.x,使用rpi.gpio监视我的输入触发器,并为我的输出设备监视I2C中继板,以防任何有用的信息。
谢谢!
答案 0 :(得分:0)
之所以没有杀死线程,是因为这样做很容易,不会给代码带来任何适当“清理”的机会。即finally
块未运行,资源泄漏等…
有多种解决方法,您可以按照@Jérôme的建议,在wait
上Event
,将超时视为继续进行的信号
asyncio
是另一种选择,因为Cancelled
异常倾向于被很好地清理,并且不存在与杀死本地线程相关的问题