Очень простой сервер / клиент 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, недостаточно для его использования в нескольких потоках.