【问题标题】:Using http and mqtt together in a single threaded python app在单线程 python 应用程序中同时使用 http 和 mqtt
【发布时间】:2016-12-21 03:40:36
【问题描述】:

我是 web 和 mqtt 编程的菜鸟,我正在开发一个使用 mqtt(通过 hivemq 或 rabbitmq 代理)的 python 应用程序,并且还需要为客户端实现 http rest api。

我意识到使用 python Bottle 框架很容易提供一个简单的 http 服务器,但是 Bottle 和 mqtt 都有它们的事件循环,我如何结合这两个事件循环,我想要一个单线程应用程序以避免复杂性。

【问题讨论】:

  • 你可能不知道。你到底想达到什么目的,我们需要更多细节
  • 为您提供更多详细信息,客户端通过 http/rest 连接到此服务,但此服务通过 mqtt 与后端的许多其他服务交互。所以这个服务必须运行 mqtt 循环(使用 paho python 客户端)并提供它使用瓶子的 http 请求,因此它必须运行瓶子的运行循环。这可以在 2 个不同的线程中完成,我的问题是有没有办法将这些组合到 1 个线程中?您是否建议使用 2 个线程更好/唯一的出路?
  • 我的意思更多的是什么是 MQTT 交互,是请求/响应吗?
  • MQTT 交互是完全异步的,发布/订阅,此服务从不阻塞 MQTT 响应。

标签: python rabbitmq mqtt bottle hivemq


【解决方案1】:

我不熟悉瓶子,但快速浏览一下文档,除了run() 函数之外,似乎没有其他方法可以启动它的事件循环。

Paho 提供了一个loop_start(),它将启动它自己的后台线程来运行 MQTT 网络事件循环。

鉴于似乎无法手动运行瓶子循环,我建议在 run() 之前调用 loop_start() 并让应用程序在 2 个单独的线程上运行,因为无法将它们组合起来,您可能不会无论如何都想要。

唯一需要注意的是 MQTT 订阅是否更新了 REST 服务发送的数据,但只要不是流式传输不太可能成为问题的大量数据。

【讨论】: