【问题标题】:AWS IoT MQTT Client for Python - How do you subscribe forever?适用于 Python 的 AWS IoT MQTT 客户端 - 如何永久订阅?
【发布时间】:2018-05-01 14:57:08
【问题描述】:

我正在使用 samples/basicPubSub/basicPubSub.py 中的示例和useWebsocket=True

我有一些文件my_test_file.py,我在其中 connect() 和 subscribe() 带有消息回调。假设回调只是写入某个日志文件。我怎样才能让这个文件一直运行,这样如果我从其他地方发布,今天,明天,一年后 - 这个日志文件会不断被写入消息?

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

client = AWSIoTMQTTClient('client_id', useWebsocket=True)
client.configureEndpoint('host', port)
client.configureCredentials('path to cert')

client.configureAutoReconnectBackoffTime(1, 32, 20)
client.configureOfflinePublishQueueing(-1)
client.configureDrainingFrequency(2)
client.configureConnectDisconnectTimeout(10)
client.configureMQTTOperationTimeout(5)
client.connect()

client.subscribe('topic name', 1, _some_callback_func)

while True:
    time.sleep(1)

my_test_file.py 的末尾有一个无限循环是唯一的方法吗?使用无限while循环,我运行文件,它是一个阻塞进程,但它是无限订阅的。它是系统服务和这个无限循环的组合吗?我在 Paho MQTT 客户端看到了一些loop_forever() 方法,aws iot mqtt 客户端有类似的吗? loop_forever() 只是实现了一个无限的while循环吗?

【问题讨论】:

  • 发布更多代码。

标签: infinite-loop mqtt publish-subscribe aws-iot


【解决方案1】:

无限循环是处理这个问题的正确方法,只要你知道该怎么做,而不是中断主进程(核心逻辑)。为此,我建议您将此脚本隔离在一个新的 python 文件中,以由主 python 脚本作为子进程运行。因此,在开始动手之前,请阅读Multiprocessing - process-based parallelism

通常总是需要一些东西来保持 Python 进程在内存上运行,除非意外重启操作系统。

这似乎不是一种优雅的处理方式,但我建议你在这个 Python 脚本后面构建一个执行管理结构,就像总是在“引导加载程序”机器/设备之后启动你的 Python 脚本,制作另一个看门狗脚本,或其他类似的东西,以防止一些互联网连接问题,强制系统重新启动或重新连接到互联网。

【讨论】:

    最近更新 更多