[patch] Python-dbus finish implementing deferred methods

John (J5) Palmieri johnp at redhat.com
Wed Jan 17 10:16:56 PST 2007


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

Looks like you are threading a proxy method.  I wonder what the interactions are here.  It seems pretty wrong.

-- 
John (J5) Palmieri <johnp at redhat.com>



More information about the dbus mailing list