Очень простой сервер / клиент python-dbus в том же процессе

Я играю с 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.

Что я делаю неправильно?

1 ответ

Решение

Использование потоков, вероятно, является проблемой. Саймон МакВитти сказал в dbus ML:

Неясно, является ли клей основного цикла dbus-glib (как установлено DBusGMainLoop) поточно-ориентированным или нет. Самым безопасным предположением всегда является "если вы не знаете, является ли foo поточно-ориентированным, то, вероятно, это не так". В любом случае, если он потокобезопасен, его подмножества, предоставляемого через dbus-python, недостаточно для его использования в нескольких потоках.

Другие вопросы по тегам