2010-01-26 7 views
5

में एसिंक विधि का कार्यान्वयन मैं पायथन डीबीस में एसिंक विधि कैसे कार्यान्वित करूं? नीचे एक उदाहरण:पायथन डीबीस

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. 

मैं ट्विस्ट के glib2 रिएक्टर का उपयोग कर रहा हूं।

अद्यतन: मुझे पता है इस व्यवहार को लागू करने के लिए संभव है - DBus एक "धारावाहिक" (अद्वितीय पहचानकर्ता) विधि कॉल करने के लिए भी शामिल है और कहा जाता विधि "उत्तर" के साथ "कॉल" मैच के लिए आदेश में इस पहचानकर्ता की पहुंच है ।

+0

यह सब कुछ स्पष्ट नहीं है कि आप यहां क्या हासिल करना चाहते हैं। 'GetUsername' क्या करना है? –

उत्तर

6

मैंने यह कोशिश नहीं की है, लेकिन dbus.service.method के लिए प्रलेखन पढ़ने async_callbacks पैरामीटर का खुलासा करता है। ऐसा लगता है जैसे एसिंक्रोनस परिणाम प्रदान करने के लिए इस पैरामीटर का उपयोग करता है। उदाहरण के लिए: जहाँ तक कॉल और प्रतिक्रिया के बीच संबंध के रूप में

d.addCallbacks(callback, errback) 

:

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

, तो इसके बजाय, आप एक API जो एक स्थगित लौटे है, तो आप आसानी से इन कॉलबैक के साथ स्थगित संबद्ध कर सकते हैं चला जाता है, मुझे लगता है कि सभी सीरियल नंबर हैंडलिंग dbus.service.method के अंदर छिपी हुई है। मुझे संदेह है कि async_callbacks सुविधा का उपयोग करते समय कॉलबैक और इरबैक फ़ंक्शंस पास किए जाते हैं या तो कुछ वर्ग के उदाहरण हैं जो कॉल करने योग्य हैं और सीरियल नंबर को एक विशेषता के रूप में परिभाषित किया गया है, या अन्य को नेस्टेड फ़ंक्शंस के रूप में परिभाषित किया गया है और सीरियल नंबर पर बंद किया गया है। इस तरह, जब आप उनमें से किसी एक को कॉल करते हैं, तो वे मूल अनुरोध के साथ प्रतिक्रिया को जोड़ने के लिए कनेक्शन पर सही मूल्य को वापस पास कर सकते हैं।

हालांकि, यह सीरियल नंबरों के आपके उल्लेख और विभिन्न एसिंक सिस्टम को लागू करने के साथ मेरे अनुभव के आधार पर थोड़ा सा शिक्षित अनुमान है। :) dbus.service.method के कार्यान्वयन का एक पठन शायद बिना किसी दर्द के वास्तविक रणनीति को प्रकट करेगा।

(ठीक है, मैं वास्तव में गया और अब कार्यान्वयन को देखा, और दुर्भाग्यवश यह जटिल है, और जब मैं सी-लेवल डीबीस बाइंडिंग में परिभाषित कुछ कोड प्राप्त करता हूं, तो मैं निशान खो देता हूं, जो थोड़ा अधिक खुदाई है मुझे करने में दिलचस्पी है। मुझे अभी भी संदेह है कि मैंने ऊपर वर्णित सामान्य विचार सही है, लेकिन कार्यान्वयन का विवरण मुझे अपेक्षा से अधिक शामिल है।)

+0

धन्यवाद जीन-पॉल: "विधि कॉल" और "विधि वापसी" के बीच सहसंबंध कैसे किया जाता है? डीबीस में, जब एक "dbus_connection_send" फ़ंक्शन को कॉल किया जाता है (निम्न स्तर सी एपीआई), कॉलर को "धारावाहिक" अद्वितीय पहचानकर्ता पास करने के लिए फ़ंक्शन एक पूर्णांक में पॉइंटर लेता है। मैं नहीं देखता कि यह कैसे ख्याल रखा जाता है। – jldupont

+0

ने इसे भी कवर करने का प्रयास करने के लिए उत्तर संपादित किया। –

+0

पॉल: आपके सभी प्रयासों के लिए धन्यवाद। आपके संकेतों के आधार पर, मैंने कुछ रिवर्स-इंजीनियरिंग के साथ आगे बढ़कर इसे समझ लिया: ऐसा लगता है कि यह आपके द्वारा वर्णित तरीके से बहुत अधिक काम करता है। – jldupont