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 回答