【问题标题】:Very simple python-dbus server/client in same process在同一进程中非常简单的 python-dbus 服务器/客户端
【发布时间】:2013-03-23 19:58:18
【问题描述】:

我在玩 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 中重现该问题。

我做错了什么?

【问题讨论】:

    标签: python debian dbus gobject


    【解决方案1】:

    使用线程可能是问题所在。 Simon McVittie 在dbus ML 中说:

    目前尚不清楚 dbus-glib 主循环是否粘合(由 DBusGMainLoop) 是否是线程安全的。最安全的假设总是 “如果你不知道 foo 是否是线程安全的,它可能不是”。在 任何情况下,如果它线程安全的,它的子集就暴露了 通过 dbus-python 不足以在多个线程中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多