2013-04-02 5 views
3

Я играю с DBus и python. Я создал очень простой клиент DBus и соответствующий сервер. Он отлично работает, когда каждый работает на своем собственном процессе python.Очень простой сервер/клиент python-dbus в том же процессе

Однако я пытаюсь заставить его работать в том же процессе, но он работает только 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

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

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

Смежные вопросы