पाइथन मल्टीप्रोसेसिंग विथ कतार बनाम जीरोएमक्यू आईपीसी


10

मैं ZeroMQ का उपयोग करके पायथन एप्लिकेशन लिखने में व्यस्त हूं और ZGuide में वर्णित के रूप में माजर्डोमो पैटर्न की विविधता को लागू कर रहा हूं

मेरे पास श्रमिकों और ग्राहकों के एक समूह के बीच मध्यस्थ के रूप में एक दलाल है। मैं आने वाले हर अनुरोध के लिए कुछ व्यापक लॉगिंग करना चाहता हूं, लेकिन मैं नहीं चाहता कि दलाल ऐसा करने में समय बर्बाद करें। ब्रोकर को उस लॉगिंग रिक्वेस्ट को कुछ और पास करना चाहिए।

मैंने दो तरीके सोचे: -

  1. ऐसे श्रमिक बनाएं जो केवल लॉगिंग के लिए हैं और ZeroMQ IPC परिवहन का उपयोग करते हैं
  2. एक कतार के साथ मल्टीप्रोसेसिंग का उपयोग करें

मुझे यकीन नहीं है कि कौन सा उस मामले के लिए बेहतर या तेज है। पहला विकल्प मुझे वर्तमान कार्यकर्ता बेस कक्षाओं का उपयोग करने की अनुमति देता है जो मैं पहले से ही सामान्य श्रमिकों के लिए उपयोग करता हूं, लेकिन दूसरा विकल्प लागू करने के लिए तेज लगता है।

मैं उपरोक्त सलाह या संभवतः एक अलग समाधान पर कुछ सलाह या टिप्पणी करना चाहूंगा।

जवाबों:


4

मुझे जोनाथन ने जो प्रस्तावित किया था, जैसे मानक उपकरण का उपयोग करने का दृष्टिकोण पसंद है। आपने यह उल्लेख नहीं किया कि आप किस ओएस पर काम कर रहे हैं, लेकिन एक और विकल्प जो उसी भावना का अनुसरण करता है वह है पायथन के मानक लॉगिंग मॉड्यूल का एक साथ उपयोग करना logging.handlers.SysLogHandlerऔर लॉगिंग संदेश को rsyslog सेवा (किसी भी लिनक्स / यूनिक्स पर उपलब्ध) भेजना , लेकिन मैं लगता है कि वहाँ भी एक विंडोज़ विकल्प है , लेकिन मैंने कभी उस का उपयोग नहीं किया है)।

अनिवार्य रूप से यह पूरी प्रणाली उसी चीज को लागू करती है जिसे आप बंद कर रहे हैं। आपकी स्थानीय प्रक्रिया किसी अन्य व्यक्ति द्वारा संभाला / संसाधित / लिखे जाने के लिए लॉग संदेश को कतारबद्ध करती है। इस मामले में, कोई और ( rsyslog) एक प्रसिद्ध, सिद्ध सेवा है जिसमें बहुत अधिक अंतर्निहित कार्यक्षमता और लचीलापन है।

इस दृष्टिकोण का एक और लाभ यह है कि आपका उत्पाद अन्य sysadmin साधनों के साथ बहुत बेहतर एकीकृत करेगा जो कि syslog के ऊपर बनाए गए हैं। और उस विकल्प को पाने के लिए आपको किसी भी कोड को लिखने की भी आवश्यकता नहीं होगी।


1
एक सुझाव के लिए +1 जो पहिए को फिर से लगाने से बचता है। मैं इस तरह से डिजाइन एक प्रणाली विरासत में मिला बुरा नहीं होगा। यह अच्छी तरह से काम करता है, फिर भी भविष्य के संशोधनों के लिए स्वतंत्रता की कई डिग्री प्रदान करता है।
evadeflow

2

आप दूरस्थ लॉगिंग को लागू करने के लिए एक तीसरी संभावना पर विचार करना चाह सकते हैं। यदि आप मानक पायथन लॉगिंग मॉड्यूल का उपयोग logging.QueueHandlerकरते हैं, तो आप अपने श्रमिकों, ग्राहकों और ब्रोकर में कक्षा का उपयोग करने और logging.QueueListenerअपनी दूरस्थ लॉगिंग प्रक्रिया में कक्षा का उपयोग करने पर विचार कर सकते हैं।

multiprocessing.Queueअपने आवेदन प्रक्रियाओं और लॉगिंग प्रक्रिया के बीच परिवहन के रूप में सामान्य पायथन का उपयोग करने के बजाय , Queueअपने वर्ग को मानक पायथन के लिए ड्रॉप-इन प्रतिस्थापन होने के लिए ज़ीरोक्म का उपयोग करके अपने स्वयं के प्रतिस्थापन वर्ग को लागू करें Queue। इस तरह आपका एप्लिकेशन वितरित डेटा केंद्रों के माध्यम से एकल मल्टी-कोर कंप्यूटर से किसी भी वातावरण में अनलेडेड चलाने में सक्षम होगा।

संक्षेप में, QueueHandlerअपने सभी कार्यकर्ताओं, ग्राहकों और दलालों में एक मानक पायथन लॉगर का उपयोग करें और लॉगिंग के भारी उठाने को संभालने के लिए अपनी पसंद के आधार पर QueueListenerऔर एक स्वतंत्र प्रक्रिया बनाएं logging


मैं पायथन 2.7 का उपयोग कर रहा हूं। मेरा मानना ​​है कि क्यूहैंडलर वर्ग केवल पायथन 3.2 से उपलब्ध है।
इमरान

पायथन 3 से कोड चुनना और इसे सीधे अपने ऐप के हिस्से के रूप में उपयोग करना बहुत आसान होगा।
जोनाथन

मैं कोशिश करूँगा और आपको
बता

0

ये मौलिक रूप से अलग-अलग दृष्टिकोण हैं, प्रत्येक के पेशेवरों और विपक्षों के अपने-अपने सेट हैं, जिन्हें आप बाद के विकास के चरण में सबसे अधिक बार देख पाएंगे।

मैंने दो तरीके सोचे: -

  1. ऐसे श्रमिक बनाएं जो केवल लॉगिंग के लिए हैं और ZeroMQ IPC परिवहन का उपयोग करते हैं
  2. एक कतार के साथ मल्टीप्रोसेसिंग का उपयोग करें

एक तरीका जिसे आप आज़मा सकते हैं, वह है अतिरिक्त लॉगिंग-वर्कर, जैसा कि दृष्टिकोण 1 में। आप अपने कार्यकर्ताओं को एक मेमेकिंग लॉगिंग क्लस्टर में जाने दे सकते हैं, और लॉगिंग वर्कर वर्तमान संसाधन लोड की निगरानी करता है और किसी दिए गए संसाधन लोड पैरामीटर को पार करने पर, कार्यकर्ता IOPs सीमित डिवाइस (जैसे हार्डडिस्क) में प्रवेश करता है।

मुझे कैनाथन के साथ जोनाथन का दृष्टिकोण भी पसंद है कि मैं भी ज्यादातर पायथन 2.x का उपयोग करता हूं, और आपको वास्तव में प्रदर्शन-लिफाफे को धक्का देने के लिए अपने लॉगिंग बैकएंड को सेटअप करना होगा।

अगर मैं गलत हूं तो मुझे सुधारें, लेकिन मेरा मानना ​​है कि आप कुछ वास्तव में डेटा-गहन कार्य कर रहे हैं, भंडारण के साथ IOP आपकी अड़चन है।

एक सुविधाजनक तरीका अभी भी ब्रोकर को brokerageलॉगिंग करने देना होगा - जैसा कि वर्णित रूप में है - एक केंद्रीय ब्रोकर उदाहरण के सभी नुकसानों के साथ। उदाहरण के लिए यदि ब्रोकर इतनी अधिक डिमांड में है कि उसे स्टोरेज पर वापस जाने के लिए लिखे गए लॉग्स को लिखने के लिए कभी भी सांस लेने की जगह नहीं मिलती है, तो आपको दूसरा तरीका अपनाने की जरूरत होगी।

आप अंततः एक ब्रोकरलेस मॉडल के साथ समाप्त हो सकते हैं। यह श्रमिकों के बीच अपने काम को प्रबंधित करने के साथ है। एक सरल उदाहरण में, एक वितरित गोल-रॉबिन एल्गोरिथ्म के माध्यम से ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.