I have an intermittent problem with my Python client implementation, and I'm looking for some help.
I am trying to create a minimal test case, but the problem seems to be dependent on timing, which suggests a race condition.
My code looks like this (simplified):
...
client = mqtt.Client(client_id=self.ecn, clean_session=False, userdata=None, protocol=mqtt.MQTTv311, transport="tcp")
...
(configure callbacks etc.)
...
client.connect(host, int(port), keepalive=60)
client.loop_start()
self.ms_client = client
...
message_info = self.ms_client.publish(topic, payload=json.dumps(payload), qos=2, retain=False)
message_info.wait_for_publish()
The problem is that wait_for_publish() never returns.
If I remove it, then everything works fine, and my on_publish() callback is called as expected.
But I want to handle each publish synchronously.
I tried replacing wait_for_publish() with is_published() as follows:
while not message_info.is_published():
time.sleep(1)
But the result is the same. The code just hangs.
What is interesting is that if I replace time.sleep() with a call to loop():
while not message_info.is_published():
self.ms_client.loop(1)
This works!
Does this suggest a deadlock in the threaded interface?
I have looked through the GitHub issues, and
#309 sounded somewhat related.
But this was fixed in 1.4, and I have tested both 1.3 and 1.4 and both display the problem.
Steve Cope's
website mentions some "strange behaviour" when using loop_start().
Does this suggest there may be a race condition in the threaded interface?
Any other suggestions appreciated,
Ben.