【问题标题】:Python message passing to unique threadsPython 消息传递给唯一线程
【发布时间】:2013-12-17 09:43:22
【问题描述】:

我有一个管理线程以与外部传感器设备通信的应用程序(实际上是另一个应用程序的插件)。外部传感器向应用程序发送事件,但应用程序也可以向传感器发送动作。有几种类型的设备,每种都有需要特殊编码的独特品质(温度、压力等)。与传感器设备的所有通信都是通过 IP 进行的。

在应用程序中,我为每个传感器实例创建一个线程。这是代码示例

self.phThreadDict[phDevId] = tempsensor(self, phDevId, phIpAddr, phIpPort, phSerial, self.triggerDict)
self.phThreadDict[phDevId].start()

在每个线程中,我为传感器发送的事件设置回调处理程序,然后在最后进入循环。

while not self.shutdown:
    self.plugin.sleep(0.5)

线程然后处理传入事件并调用主线程或产生主线程的实际程序。所有这些都非常有效。

但是,有时我还需要向特定传感器发送请求。为此目的在每个线程中定义了方法,我从主线程调用这些方法。例如:

self.phThreadDict[dev.id].writeDigitalOutput(textLine, lcdMessage)

这也行得通,但我相信代码实际上是在主线程中执行的,而不是在传感器特定的线程中执行的。

我的问题是:我有哪些选项可以将工作传递给特定的目标线程并让线程执行工作然后返回成功或失败?

【问题讨论】:

    标签: python message-queue python-multithreading


    【解决方案1】:

    稍微扩展一下 Thomas Orozco 的现场 cmets,

    self.phThreadDict[dev.id].writeDigitalOutput(textLine, lcdMessage)
    

    在运行它的任何线程中执行。如果您主线程运行它,那么主线程将完成所有工作。如果来自其他线程,则该线程将运行它。

    除了每个线程有一个Queue,对于要接收要处理的工作项的描述,您还需要一个Queue 供线程放置 结果(您也可以为每个线程使用另一个Queue,但这有点过头了)。

    主线程将从后者Queue 中提取结果。请注意,您可以(而且这样做很常见)将元组放在Queues 上。因此,例如,在主线程的回话 Queue 线程可能会放置以下形式的元组:

    (result, my_thread_id, original_work_description)
    

    这足以确定哪个线程响应哪个工作项返回什么结果。也许你不需要所有这些。也许你需要的不止这些。猜不出来;-)

    【讨论】:

      【解决方案2】:

      确实,这是在主线程中执行代码。


      Use queues,这就是它们的用途(任务同步和线程之间的消息传递)。

      每个传感器管理器线程使用一个队列。

      • 您的传感器管理器线程应该从队列中获取项目而不是休眠(这是一个阻塞调用)。
      • 您的“主”线程应该将项目放入队列而不是运行函数(这通常是非阻塞调用)。

      您需要做的就是定义一种消息格式,让主线程告诉管理线程要执行哪些函数以及要使用哪些参数。

      【讨论】:

        猜你喜欢
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 2021-07-08
        • 2021-03-27
        • 2015-08-01
        • 1970-01-01
        相关资源
        最近更新 更多