2013-04-02 30 views
3

我在玩DBus和python。我創建了一個非常簡單的DBus客戶端和相應的服務器。當它們運行在它自己的python進程上時,它可以很好地工作。非常簡單的python-dbus服務器/客戶端在同一個過程中

但是,我試圖讓它在相同的過程中工作,但它只能運行10%的時間我運行代碼。剩下的時間,它只是凍結。

我儘可能簡化了代碼,問題依然存在。代碼如下:

from threading import Thread 
import gobject 
import dbus 
import dbus.service 
import dbus.mainloop.glib 

gobject.threads_init() 
dbus.mainloop.glib.threads_init() 
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 

objname="com.visualtools.venom.MockService" 
objpath="/" + objname.replace(".","/") 

class ExampleApi(dbus.service.Object): 
    def __init__(self): 
     dbus.service.Object.__init__(self, dbus.service.BusName(objname, dbus.SystemBus()), objpath) 
    @dbus.service.method(objname, out_signature='s') 
    def ping(self, msg): 
     return "Message is: %s" %msg 

def client(): 
    while not loop.is_running(): 
     continue 
    api = dbus.Interface(dbus.SystemBus().get_object(objname, objpath), objname) 
    print "calling api..." 
    result = api.ping("i'm the client") 
    print "api result is: %s" %result 
    loop.quit() 

loop = gobject.MainLoop() 
server = ExampleApi() 
Thread(target=client).start() 
loop.run() 

&粘貼剛纔複製到一個文件,並運行它的10倍。我可以在debian sid和debian squeeze中重現這個問題。

我在做什麼錯?

回答

1

使用線程可能是問題。西蒙McVittie在dbus ML說:

目前還不清楚DBUS,能說會道的主循環膠(由 DBusGMainLoop成立)是線程安全與否。最安全的假設總是 「如果你不知道foo是否是線程安全的,它可能不是」。在 任何情況下,如果它線程安全,它通過dbus-python暴露 的子集是不足以在多個線程中使用它。

相關問題