Python消息传递给唯一线程

时间:2013-12-01 18:12:12

标签: python message-queue python-multithreading

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

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

我的问题是:将工作传递给特定目标线程并让线程执行工作然后返回成功或失败,我有什么选择?

2 个答案:

答案 0 :(得分:3)

对托马斯·奥罗斯科(Thomas Orozco)的现场评论进行了扩展,

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

在任何运行它的线程中执行。如果你从主线程运行,那么主线程将完成所有操作。如果来自其他一些线程,那么该线程将运行它。

除了每个线程Queue之外,对于接收要处理的工作项描述的线程,您还需要一个Queue个线程结果放在上面(你也可以为每个线程使用另一个Queue,但这样做太过分了。)

主线程将从后者Queue中拉出结果。请注意,您可以 - 并且这样做很常见 - 将元组放在Queues上。因此,例如,在回调主线程Queue线程上可能会出现以下形式的元组:

(result, my_thread_id, original_work_description)

这足以弄清楚哪个线程返回了响应哪个工作项的结果。也许你并不需要所有这些。也许你还需要更多。无法猜测; - )

答案 1 :(得分:2)

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


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

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

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

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