2010-01-27 10 views
5

यह एक ही main loop के माध्यम से dbus साथ asyncore एकीकृत करने के लिए संभव है?अजगर asyncore और dbus

आमतौर पर, DBus एकीकरण glib मुख्य लूप के माध्यम से किया जाता है: यह या तो asyncore इस मुख्य लूप या है asyncore के dbus उपयोग एकीकृत करना संभव है?

+0

जब आप ग्लिब करते हैं तो आप एसिंककोर का उपयोग क्यों करेंगे? glib अधिक सक्षम लगता है ... –

उत्तर

7

asyncore बेकार है। glib पहले से ही async सामान प्रदान करता है, तो बस सब कुछ करने glib के mainloop का उपयोग करें।

0

यद्यपि आप मिल गया क्या शायद एक पूरी तरह से उचित जवाब है, वहाँ एक और तरीका है - आप asyncore के पाश से प्रति का उपयोग करने की जरूरत नहीं है। बस शून्य टाइमआउट के साथ asyncore.loop को कॉल करें और 1 की गिनती करें, जो इसे फिर से चालू करता है (और इस प्रकार फ़ंक्शन का नाम पूरी तरह से भ्रामक बनाता है) और केवल एक बार सॉकेट का चुनाव करता है। जितनी बार आपको आवश्यकता हो उतनी बार कॉल करें।

मुझे ग्लिब के एसिंक समर्थन के बारे में कुछ भी पता नहीं है, लेकिन अगर इसे थ्रेड की आवश्यकता है तो आपको इस तरह से एसिंकोर का उपयोग करके बेहतर प्रदर्शन मिल सकता है क्योंकि यह चयन या मतदान का उपयोग करेगा और अतिरिक्त धागे को बढ़ाने की आवश्यकता नहीं होगी।

+1

आपके विचारों के लिए धन्यवाद - मैं इस परियोजना के लिए मुड़ने पर बस गया हूं। – jldupont

1

मैं एक उचित MainContext को my own projects में से एक कहा जाता AsyncoreGSource

बस इसे attach के लिए एक छोटी सी GSource आवरण लिखा है:

source = AsyncoreGSource([socket_map]) 
source.attach([main_context]) 

स्वाभाविक रूप से चूक asyncore.socket_map और default MainContext क्रमशः रहे हैं।

आप monkey-patching asyncore.socket_map भी कोशिश कर सकते हैं, जो मेरा समाधान होता है, मैंने GLib python bindings source code for GSource के माध्यम से नहीं दबाया होता।

+0

ध्यान दें कि मैंने इसके बाद कुछ प्रदर्शन समस्याओं में भाग लिया है, और एक संस्करण है जो लिनक्स पर जीएलआईबी के मतदान इंटरफेस के साथ पूर्ण एकीकृत है (लेकिन विंडोज़ नहीं)। चीजें स्थिर होने पर मैं इस जवाब को अपडेट कर दूंगा। –

संबंधित मुद्दे