<br><div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I&#39;m not sure that I understood that. Could you provide a simple test case that<br>
should work, but doesn&#39;t, and describe what it ought to do?</blockquote><div><br>Ok, this is a little ugly, but it&#39;s as simple as I can get it...<br><br>tsuraan@localhost ~/test/python/dbus/blocking $ cat Slow.py 
<br>import gobject<br>import dbus<br>import dbus.service<br>import dbus.glib<br>import time<br><br>class Slow(dbus.service.Object):<br>&nbsp; def __init__(self):<br>&nbsp;&nbsp;&nbsp; bus = dbus.SystemBus()<br>&nbsp;&nbsp;&nbsp; bus_name = dbus.service.BusName
(&quot;com.example.Slow&quot;, bus)<br><br>&nbsp;&nbsp;&nbsp; super(Slow, self).__init__(bus_name, &quot;/Object&quot;)<br><br>&nbsp; @dbus.service.method(&quot;com.example.Slow&quot;)<br>&nbsp; def sfunction(self):<br>&nbsp;&nbsp;&nbsp; # Sleep a while, but not long enough for dbus timeout...
<br>&nbsp;&nbsp;&nbsp; time.sleep(5)<br>&nbsp;&nbsp;&nbsp; return &#39;Hi!&#39;<br><br><br>if __name__ == &quot;__main__&quot;:<br>&nbsp; gobject.threads_init()<br>&nbsp; dbus.glib.init_threads()<br><br>&nbsp; s = Slow()<br>&nbsp; gobject.MainLoop().run()<br><br>tsuraan@localhost
 ~/test/python/dbus/blocking $ cat Caller.py <br>import gobject<br>import dbus<br>import dbus.service<br>import dbus.glib<br>import time<br>import threading<br><br>class Caller(dbus.service.Object):<br>&nbsp; def __init__(self):
<br>&nbsp;&nbsp;&nbsp; self.bus = dbus.SystemBus()<br>&nbsp;&nbsp;&nbsp; bus_name = dbus.service.BusName(&quot;com.example.Caller&quot;, self.bus)<br><br>&nbsp;&nbsp;&nbsp; super(Caller, self).__init__(bus_name, &quot;/Object&quot;)<br><br>&nbsp; @dbus.service.method(&quot;
com.example.Caller&quot;)<br>&nbsp; def cfunction(self):<br>&nbsp;&nbsp;&nbsp; obj = self.bus.get_object(&quot;com.example.Slow&quot;, &quot;/Object&quot;)<br>&nbsp;&nbsp;&nbsp; thread = threading.Thread(target=obj.sfunction)<br>&nbsp;&nbsp;&nbsp; thread.start()<br>&nbsp;&nbsp;&nbsp; # Sleep for a moment to make the context switch happen
<br>&nbsp;&nbsp;&nbsp; time.sleep(1)<br>&nbsp;&nbsp;&nbsp; return &#39;done&#39;<br>&nbsp;&nbsp;&nbsp; <br><br><br>if __name__ == &quot;__main__&quot;:<br>&nbsp; gobject.threads_init()<br>&nbsp; dbus.glib.init_threads()<br><br>&nbsp; c = Caller()<br>&nbsp; gobject.MainLoop().run()<br><br>
tsuraan@localhost ~/test/python/dbus/blocking $ cat test.py <br>import dbus<br>import dbus.glib<br>import time<br><br>bus = dbus.SystemBus()<br>obj = bus.get_object(&quot;com.example.Caller&quot;, &quot;/Object&quot;)<br>
start = time.time()<br>obj.cfunction()<br>print &#39;call took&#39;, time.time()-start, &#39;seconds&#39;<br><br></div><br>tsuraan@localhost ~/test/python/dbus/blocking $ python Slow.py &amp; python Caller.py &amp;<br>[1] 8636
<br>[2] 8637<br>tsuraan@localhost ~/test/python/dbus/blocking $ python test.py <br>call took 5.00829911232 seconds<br><br><br>One would expect the call to have taken about one second, but instead it takes five.&nbsp; It looks like the first dbus method in Caller cannot return until its call has completed.&nbsp; Is that a bug, or is that a part of the spec?&nbsp; Or, is this a glib problem, and I should ask them about it?&nbsp; It doesn&#39;t really look like glib and python threads play very nicely together, so maybe that&#39;s the problem.
<br></div>