私はDBusとpythonで遊んでいます。非常に単純な DBus クライアントと対応するサーバーを作成しました。それぞれが独自のpythonプロセスで実行されると、完全に機能します。
ただし、同じプロセスで動作させようとしていますが、コードを実行する回数の 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 で問題を再現できます。
私は何を間違っていますか?