2010-01-26 4 views
5

파이썬 DBus에서 비동기 메서드를 구현하려면 어떻게해야합니까? 아래의 예 :파이썬 DBus에서 비동기 메서드 구현

class LastfmApi(dbus.service.Object): 
    def __init__(self): 
     bus_name = dbus.service.BusName('fm.lastfm.api', bus=dbus.SessionBus()) 
     dbus.service.Object.__init__(self, bus_name, '/') 

    @dbus.service.method('fm.last.api.account', out_signature="s") 
    def getUsername(self): 
     ## How do I get this method done asynchronously ?? 
     ## For example, this method should go off and retrieve the "username" 
     ## asynchronously. When this method returns, the "username" isn't available 
     ## immediately but will be made available at a later time. 

저는 Twisted 's glib2 reactor를 사용하고 있습니다.

업데이트 :이 동작을 구현할 수 있음을 알고 있습니다. - DBus에는 메서드 호출에 대한 "직렬"(고유 식별자)이 포함되며 호출 된 메서드는 "호출"과 "응답"을 일치시키기 위해이 식별자에 액세스합니다. .

+0

여기에서 수행하려는 작업이 모두 명확하지는 않습니다. 'getUsername'은 무엇을하기로되어 있습니까? –

답변

6

나는 이것을 시도하지 않았지만, dbus.service.method에 대한 문서를 읽으면 async_callbacks 매개 변수가 나타납니다. 이 매개 변수를 사용하여 비동기 결과를 제공하는 것처럼 들립니다. 예를 들어, 대신, 당신은이 이연 반환하는 API가있는 경우

@dbus.service.method('fm.last.api.account', out_signature="s", 
        async_callbacks=("callback", "errback")) 
def getUsername(self, callback, errback): 
    reactor.callLater(3, callback, "alice") 

는, 당신은 쉽게 이러한 콜백 이연 연결할 수 있습니다

d.addCallbacks(callback, errback) 

을 지금까지 호출과 응답 사이의 상관 관계로 간다. 나는 모든 일련 번호 처리가 dbus.service.method 안에 숨겨져 있다고 가정한다. 나는 당신이 async_callbacks 기능을 사용할 때 전달되는 콜백 및 오류 함수가 호출 가능하고 속성으로 일련 번호가있는 클래스의 인스턴스이거나 다른 경우 중첩 된 함수로 정의되어 일련 번호를 덮고 있다고 의심합니다. 이런 식으로, 당신이 그들 중 하나를 부를 때, 연결에 올바른 값을 다시 전달하여 응답을 원래 요청과 연관시킬 수 있습니다.

그러나 일련 번호에 대한 언급과 다양한 비동기 시스템 구현 경험을 토대로 한 약간의 추측에 불과합니다. :) dbus.service.method 구현의 읽기는 아마도 너무 많은 고통없이 실제 전략을 나타낼 것입니다.

(좋아요, 실제로 구현을 보았습니다. 불행히도 다소 복잡한 데, C 레벨 dbus 바인딩에 정의 된 일부 코드가 생겼을 때 흔적을 잃었습니다. 위에서 설명한 일반적인 생각이 맞다고 생각하지만, 구현 세부 사항이 예상보다 복잡합니다.)

+0

Jean-Paul : "메서드 호출"과 "메서드 반환"사이의 상관 관계는 어떻게 완료됩니까? DBus에서 "dbus_connection_send"함수가 호출되면 (저수준 C API) 함수는 "직렬"고유 식별자를 호출자에게 전달하기 위해 정수에 대한 포인터를 사용합니다. 나는 이것이 여기서 어떻게 보살펴 지는지 보지 못한다. – jldupont

+0

답변을 편집하여 해당 내용을 처리했습니다. –

+0

Paul : 모든 노력에 감사드립니다. 당신의 단서를 기반으로, 나는 리버스 엔지니어링을 계속하고 그것을 알아 냈습니다 : 당신이 묘사하는 방식대로 작동하는 것처럼 보입니다. – jldupont