我正在为Raspberry Pi开发一个小型Python程序,用于监听Zigbee网络上的一些事件。
我写这个的方式相当简单,我有一段时间(真):循环检查来自Zigbee的Uniquie ID(UID)。如果收到UID,则将其发送到包含一些回调方法的字典。因此,例如,在字典中,密钥101与名为PrintHello()的方法相关联。
因此,如果接收到该键/ UID,则会执行PrintHello方法 - 非常简单,如下所示:
if self.expectedCallBacks.has_key(UID) == True:
self.expectedCallBacks[UID]()
我知道这种做法可能过于简单化了。我主要担心的是,如果系统忙于处理方法而系统收到另一条消息怎么办?
在嵌入式MCU上,我可以通过循环缓冲器+中断轻松处理,但是我有点迷失了它用RPi做到这一点。我是否需要为Zigbee模块实现一个新线程,它基本上填充一个缓冲区,然后回调处理程序可以从中检索/读取?
我很感激有关如何更有力地实现这一点的任何建议。
答案 0 :(得分:0)
线程在某种程度上肯定有帮助。以下是使用ThreadPool
:
from multiprocessing.pool import ThreadPool
pool = ThreadPool(2) # Create a 2-thread pool
while True:
uid = zigbee.get_uid()
if uid in self.expectedCallbacks:
pool.apply_async(self.expectedCallbacks[UID])
这将启动线程池中线程的回调,并且应该有助于防止事件在将它们发送到回调处理程序之前进行备份。 ThreadPool
将在内部处理排队任何在池中的所有线程都在工作时无法运行的任务。
但是,请记住,Raspberry Pi只有一个CPU内核,因此您不能同时执行多个基于CPU的操作(这甚至忽略了由GIL引起的Python中的线程限制,通常使用multiple processes而不是线程来解决。这意味着无论您拥有多少线程/进程,一次只能有一个访问CPU。因此,您可能不希望多个线程实际运行回调,因为当您添加更多线程时,由于操作系统需要在线程之间不断切换,因此只会减慢速度。