监听网络上的事件并自动处理回调

2024-10-02 12:30:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Raspberry Pi开发一个小型Python程序,用于侦听Zigbee网络上的一些事件。你知道吗

我写这篇文章的方式相当简单,我有一段时间(真的):循环检查来自Zigbee的Uniquie ID(UID)。如果收到UID,它将被发送到包含一些回调方法的字典。例如,在字典中,键101被绑定到一个名为PrintHello()的方法。你知道吗

因此,如果接收到key/UID,将执行PrintHello方法-非常简单,如下所示:

if self.expectedCallBacks.has_key(UID) == True:
        self.expectedCallBacks[UID]()

我知道这种方法可能太简单了。我主要关心的是,如果系统正忙于处理一个方法,而系统又收到另一条消息怎么办?你知道吗

在嵌入式MCU上,我可以很容易地处理循环缓冲区+中断,但我有点迷失了如何使用RPi。我是否需要为Zigbee模块实现一个新线程,它基本上填充了一个缓冲区,然后回调处理程序可以从中检索/读取?你知道吗

如果能就如何更有力地实施这一点提出任何建议,我将不胜感激。你知道吗


Tags: 方法keyself程序网络uid字典系统
1条回答
网友
1楼 · 发布于 2024-10-02 12:30:58

线程在某种程度上肯定会有所帮助。下面是一个使用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的操作(这甚至忽略了Python中由GIL引起的线程限制,这通常是通过使用multiple processes而不是线程来解决的)。这意味着无论有多少个线程/进程,一次只能有一个线程/进程访问CPU。因此,您可能不希望实际运行回调的线程超过一个,因为添加更多线程只会减慢速度,因为操作系统需要在线程之间不断切换。你知道吗

相关问题 更多 >

    热门问题