प्रश्न:gevent का उपयोग करना और एक उपप्रक्रिया के साथ संवाद के लिए एक साथ बहु
मैं एक कुशल तरीके से विंडोज पर एक साथ बहु मॉड्यूल का उपयोग कर सकते हैं gevent साथ?
परिदृश्य:
मैं एक gevent आधारित अजगर विंडोज पर कर अतुल्यकालिक मैं/हे आवेदन किया है। एप्लिकेशन ज्यादातर I/O बाध्य है, लेकिन उच्च CPU लोड की स्पाइक्स भी हैं। इस एप्लिकेशन को अपने stdin और stdout के माध्यम से एक कंसोल अनुप्रयोग को नियंत्रित करने की आवश्यकता होगी। मैं इस कंसोल एप्लिकेशन को संशोधित नहीं कर सकता और उपयोगकर्ता अपने स्वयं के कस्टम एक का उपयोग करने में सक्षम होगा, केवल टेक्स्ट (लाइन) आधारित संचार प्रोटोकॉल तय किया गया है।
मेरे पास उपप्रोसेस और धागे का उपयोग करके एक कार्यान्वयन कार्यान्वयन है, लेकिन मैं मुख्य थ्रू को एकल-थ्रेडेड में बदलने के लिए अलग-अलग सबप्रोसेस आधारित संचार कोड को एक अलग प्रक्रिया में ले जाना चाहता हूं। मैं इसके लिए मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करने की योजना बना रहा हूं।
पहले पढ़ने:
मैं वेब खोज किया गया है एक बहुत और कुछ स्रोत कोड को पढ़ने के लिए है, इसलिए मुझे पता है कि बहु मॉड्यूल एक पाइप विंडोज पर नामित पाइप के आधार पर कार्यान्वयन का उपयोग कर रहा है। Multiprocessing.queue.Queue ऑब्जेक्ट्स की एक जोड़ी दूसरी पायथन प्रक्रिया के साथ संवाद करने के लिए उपयोग की जाएगी। ये कतार उस पाइप कार्यान्वयन पर आधारित हैं, उदा। आईपीसी नामित पाइप के माध्यम से किया जाएगा।
मुख्य प्रश्न यह है कि आने वाली कतार की विधि को कॉल करने से गीवेन्ट के मुख्य पाश को अवरुद्ध कर दिया जाएगा या नहीं। उस विधि के लिए एक टाइमआउट है, इसलिए मैं इसे एक छोटे से टाइमआउट के साथ लूप में बना सकता हूं, लेकिन यह एक अच्छा समाधान नहीं है, क्योंकि यह अभी भी कम समय अवधि के लिए अपनी कम I/O विलंबता को प्रभावित करने के लिए भूगर्भ को अवरुद्ध कर देगा।
मैं विंडोज़ पर पाइप का उपयोग करने की पूरी समस्या को रोकने के सुझावों के बारे में भी सुझाव देता हूं, जो कठिन और कभी-कभी नाजुक होने के लिए जाना जाता है। मुझे यकीन नहीं है कि विंडोज़ पर साझा मेमोरी आधारित आईपीसी संभव है या नहीं। हो सकता है कि मैं कंसोल एप्लिकेशन को इस तरह से लपेट सकूं जो नेटवर्क सॉकेट का उपयोग करके बाल प्रक्रिया के साथ संवाद करने की अनुमति दे, जो कि गीवेंट के साथ अच्छी तरह से काम करने के लिए जाना जाता है।
यदि संभव हो तो कृपया मेरे प्राथमिक उपयोग मामले पर सवाल न करें। धन्यवाद।
मुझे विंडोज और यूनिक्स दोनों पर उपप्रणाली के पाइप को अतुल्यकालिक रूप से पढ़ने और लिखने के लिए उपयुक्त मॉड्यूल मिला। इसे काफी सामान्य समाधान प्राप्त करने के लिए गीवेंट के इवेंट लूप के साथ एकीकृत किया जा सकता है: http://code.activestate.com/recipes/440554- मॉड्यूल-to-allow-asynchronous-subprocess-use-on-win/ – fviktor