3

私は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 で問題を再現できます。

私は何を間違っていますか?

4

1 に答える 1

1

スレッドの使用がおそらく問題です。Simon McVittie はdbus MLで次のように述べています。

dbus-glib メイン ループ グルー (DBusGMainLoop によって設定) がスレッド セーフかどうかは不明です。最も安全な仮定は、常に「foo がスレッドセーフかどうかわからない場合は、おそらくそうではない」ということです。いずれにせよ、それスレッドセーフである場合、dbus-python を介して公開されるそのサブセットは、複数のスレッドで使用するのに十分ではありません。

于 2013-04-02T14:28:00.157 に答える