Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[paho-dev] Python client: threaded interface problem

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.

Back to the top