在回调执行期间处理/排队回调调用

时间:2017-08-16 19:10:11

标签: python mqtt paho

我正在使用paho-mqtt库编写一个MQTT脚本,当有一条消息发布到某个主题时触发回调函数,我正在尝试确定是否需要编写某种“消息队列”功能,以推迟连续回调的执行,直到返回上一个回调。

回调函数可能需要一段时间才能执行,并且可能存在在回调函数返回之前将另一条消息发布到触发器主题的情况。

似乎MQTT会自行推迟连续回调,直到前一个回调返回,但我只是希望得到一些确认。

由于

Aarron

1 个答案:

答案 0 :(得分:0)

我的理解是回调排队但由于我不是100%肯定我写了一对脚本来测试行为。

首先是订阅和回调:

import paho.mqtt.client as mqtt
from time import sleep

def on_connect(client, userdata, flags, rc):
    client.subscribe('callback-test/#')

def test1(client, userdata, message):
    print("Test1 start")
    sleep(2)
    print("Test1 done")

def test2(client, userdata, message):
    print("Test2 start")
    sleep(2)
    print("Test2 done")

def on_log(client, userdata, level, buf):
    print(level, buf)

client = mqtt.Client()
client.on_connect = on_connect
client.message_callback_add('callback-test/1', test1)
client.message_callback_add('callback-test/2', test2)
client.on_log = on_log
client.connect("test.mosquitto.org")
client.loop_forever()

以下是发送消息以触发这些回调的脚本:

import paho.mqtt.client as mqtt

# noinspection PyShadowingNames,PyUnusedLocal,PyUnusedLocal,PyUnusedLocal
def on_connect(client, userdata, flags, rc):
    client.publish('callback-test/1', "test1")
    client.publish('callback-test/2', "test2")

# noinspection PyShadowingNames,PyUnusedLocal,PyUnusedLocal
def on_log(client, userdata, level, buf):
    print(level, buf)

client = mqtt.Client()
client.on_connect = on_connect
client.on_log = on_log
client.connect("test.mosquitto.org")
client.loop_forever()

当您运行两个脚本时,第一个脚本将返回:

Test1 start
Test1 done
Test2 start
Test2 done

从这个测试开始,我非常有信心它会自动排队回调。