मेरे लिए यह वास्तव में बहुत सरल है:
उपप्रक्रिया विकल्प:
subprocess
अन्य निष्पादनयोग्य चलाने के लिए है --- यह मूल रूप से वैकल्पिक के लिए कुछ समर्थन के साथ os.fork()
के चारों ओर एक आवरण और os.execve()
है नलसाजी (subprocesses से और पीआईपीई स्थापित करना। (जाहिर है अन्य ओएस इंटर-प्रोसेस संचार (आईपीसी) तंत्र, जैसे सॉकेट, एसआईएसवी साझा स्मृति और संदेश कतारों का उपयोग किया जा सकता है --- लेकिन आमतौर पर आप तीसरे भागने के लिए उपप्रोसेस का उपयोग कर रहे हैं पार्टी द्विआधारी निष्पादन योग्य ए डी जो भी इंटरफेस और आईपीसी चैनल उन समर्थन के साथ अटक जा रहे हैं)।
आमतौर पर एक तुल्यकालिक subprocess
का उपयोग करता है --- बस कुछ बाहरी उपयोगिता बुला और इसके उत्पादन वापस पढ़ने या इसके पूरा होने (शायद एक अस्थायी फ़ाइल से अपने परिणामों को पढ़ने, या यह कुछ डेटाबेस के लिए उन्हें पोस्ट किया जाता है के बाद) का इंतजार।
हालांकि कोई भी सैकड़ों उपप्रवाहों को जन्म दे सकता है और उन्हें मतदान कर सकता है। मेरी अपनी निजी पसंदीदा उपयोगिता बिल्कुल ठीक है। subprocess
मॉड्यूल का सबसे बड़ा नुकसान यह है कि इसका I/O समर्थन आम तौर पर अवरुद्ध हो रहा है। पाइथन 3.x के कुछ भविष्य संस्करण और एक वैकल्पिक asyncproc (चेतावनी जो डाउनलोड के अधिकार की ओर जाता है, किसी भी प्रकार के दस्तावेज और न ही रीडमे) को ठीक करने के लिए PEP-3145 ड्राफ्ट है। मैंने यह भी पाया है कि fcntl
आयात करने के लिए अपेक्षाकृत आसान है और सीधे अपने Popen
पीआईपीई फ़ाइल डिस्क्रिप्टरों का उपयोग करें --- हालांकि मुझे नहीं पता कि यह गैर-यूनिक्स प्लेटफॉर्म पर पोर्टेबल है या नहीं।
subprocess
लगभग कोई समर्थन ... हालांकि आप --- signal
मॉड्यूल और सादे पुराने स्कूल यूनिक्स/लिनक्स संकेतों का उपयोग कर सकते हैं धीरे अपनी प्रक्रियाओं की मौत हो गई, क्योंकि यह थे ईवेंट प्रबंधन है।
बहु विकल्प:
multiprocessing
प्रक्रियाओं के परिवार के बीच और अधिक लचीला संचार के लिए अपने मौजूदा (अजगर) कोड समर्थन के साथ भीतर कार्यों को चलाने के लिए है। विशेष रूप से मॉड्यूल के Queue
ऑब्जेक्ट्स के आस-पास multiprocessing
आईपीसी बनाने के लिए सबसे अच्छा है, लेकिन आप Event
ऑब्जेक्ट्स और कई अन्य विशेषताओं का भी उपयोग कर सकते हैं (जिनमें से कुछ संभवतः mmap
प्लेटफॉर्म पर समर्थन करते हैं जहां वह समर्थन पर्याप्त है)।
पायथन के multiprocessing
मॉड्यूल इंटरफेस और सुविधाओं जोthreading
करने के लिए बहुत समान हैं, जबकि CPython जीआईएल (ग्लोबल दुभाषिया लॉक) के बावजूद अधिक CPU/कोर के बीच अपनी प्रसंस्करण पैमाने पर करने के लिए अनुमति देता है प्रदान करना है। यह सब ठीक कणों का SMP लॉकिंग और जुटना प्रयास है कि अपने ओएस गिरी के डेवलपर्स द्वारा किया गया था लाभ उठाता है।
सूत्रण विकल्प:
threading
अनुप्रयोगों हैं, जिनमें से एक काफी संकीर्ण सीमा के लिए है मैं/हे बाध्य (कई सीपीयू कोर के पार पैमाने पर करने की जरूरत नहीं है) और जो बेहद कम से लाभ थ्रेड स्विचिंग (साझा कोर मेमोरी के साथ) बनाम प्रक्रिया/संदर्भ स्विचिंग के विलंबता और स्विचिंग ओवरहेड। लिनक्स पर यह लगभग खाली सेट है (लिनक्स प्रक्रिया स्विच समय इसके थ्रेड-स्विच के बहुत करीब हैं)।
threading
से पाइथन में दो प्रमुख नुकसान से ग्रस्त हैं।
एक, ज़ाहिर है, कार्यान्वयन विशिष्ट --- ज्यादातर CPython को प्रभावित करने वाले है। वह जीआईएल है। अधिकांश भाग के लिए, अधिकांश सीपीथन कार्यक्रमों को दो से अधिक CPUs (कोर) की उपलब्धता से लाभ नहीं होगा और अक्सर प्रदर्शन होगा जीआईएल लॉकिंग विवाद से पीड़ित होगा।
बड़ा मुद्दा जो कार्यान्वयन विशिष्ट नहीं है, धागे एक ही स्मृति, संकेत संचालकों, फ़ाइल वर्णनकर्ता और कुछ अन्य ओएस संसाधनों को साझा करता है। इस प्रकार प्रोग्रामर को ऑब्जेक्ट लॉकिंग, अपवाद हैंडलिंग और उनके कोड के अन्य पहलुओं के बारे में बेहद सावधान रहना चाहिए जो दोनों सूक्ष्म हैं और जो पूरी प्रक्रिया को मार सकते हैं, रोक सकते हैं या डेडलॉक कर सकते हैं (धागे का सूट)।
तुलना करके multiprocessing
मॉडल केवल उस संसाधन मार डालेगा और मजबूती के साथ एक बच्चे को या भाई प्रक्रिया के लापता होने से निपटने में काफी हो सकता है प्रत्येक प्रक्रिया का अपना स्मृति, फ़ाइल वर्णनकर्ता, आदि एक क्रैश या उनमें से किसी एक में बिना क्रिया का अपवाद देता है डिबगिंग, अलगाव और फिक्सिंग या धागे में समान मुद्दों के आसपास काम करने से आसान है।
- (नोट: प्रमुख अजगर सिस्टम के साथ
threading
का उपयोग करते हैं, इस तरह के रूप NumPy, गिल विवाद से काफी कम तो अपने खुद के अजगर कोड से ज्यादातर पीड़ित हो सकता है होता है कि क्योंकि वे विशेष रूप से ऐसा करने के लिए इंजीनियर किया गया है।)।
मुड़ विकल्प:
यह भी ध्यान देने योग्य है कि Twisted अभी तक एक और विकल्प है जो दोनों सुंदर और बहुत को समझने के लिए चुनौतीपूर्ण है प्रदान करता है। असल में, बिंदु जहां मुड़ के प्रशंसकों pitchforks और मशालों के साथ मेरे घर पर धावा कर सकते हैं करने के लिए सरल बनाने से अधिक होने का खतरा, मुड़ प्रदान करता है और घटना चालित सहकारी बहु-टास्किंग किसी भी (एकल) प्रक्रिया के भीतर।
को समझने के लिए कि यह कैसे एक (जो का चयन करें() या चुनाव() या इसी तरह ओएस सिस्टम कॉल के आसपास बना जा सकता है) select()
की सुविधाओं के बारे पढ़ना चाहिए संभव है। असल में यह सभी ओएस के अनुरोध को फाइल डिस्क्रिप्टर या कुछ टाइमआउट की सूची में किसी भी गतिविधि के लंबित होने का अनुरोध करने की क्षमता से प्रेरित है। select()
को इन कॉल में से प्रत्येक से
जागृति एक घटना ---, या तो कुछ अन्य (लिखने योग्य) वर्णनकर्ता या सॉकेट पर एक से जुड़े इनपुट सॉकेट या फ़ाइल वर्णनकर्ता, या बफरिंग अंतरिक्ष बनने के कुछ संख्या पर उपलब्ध (पठनीय) उपलब्ध है कुछ असाधारण स्थितियां (उदाहरण के लिए टीसीपी आउट-ऑफ-बैंड पुश किए गए पैकेट), या एक टाइमआउट।
इस प्रकार ट्विस्ट प्रोग्रामिंग मॉडल इन घटनाओं को संभालने के लिए बनाया गया है, जिसके परिणामस्वरूप "मुख्य" हैंडलर पर लूपिंग हो रही है, जिससे यह आपके हैंडलरों को ईवेंट भेज सकता है।
मैं व्यक्तिगत रूप से नाम के बारे में सोच, मुड़ प्रोग्रामिंग मॉडल के रूप में विचारोत्तेजक ... के बाद से समस्या के लिए अपने दृष्टिकोण होना चाहिए, कुछ अर्थों में, "मुड़" अंदर बाहर। इनपुट डेटा और आउटपुट या परिणामों पर संचालन की श्रृंखला के रूप में आपके कार्यक्रम की कल्पना करने के बजाय, आप अपने कार्यक्रम को सेवा या डिमन के रूप में लिख रहे हैं और यह परिभाषित करते हैं कि यह विभिन्न घटनाओं पर कैसे प्रतिक्रिया करता है। (वास्तव में मूल "मुख्य लूप" एक मुड़ कार्यक्रम के (आमतौर पर एक reactor()
है? हमेशा?)।
मुड़ कार्यक्रम चालित मॉडल के आसपास अपने मन घुमा शामिल का उपयोग कर और भी के उपयोग को छोड़कर के लिए बड़ी चुनौतियाँ किसी भी वर्ग पुस्तकालय या टूलकिट जिन्हें ट्विस्टेड फ्रेमवर्क के भीतर सह-संचालन के लिए नहीं लिखा जाता है। यही कारण है कि मुड़ता एसएसएच प्रोटोकॉल हैंडलिंग, शाप के लिए, और इसके स्वयं के उपप्रोसे/पॉपन फ़ंक्शन, और कई अन्य मॉड्यूल और प्रोटोकॉल हैंडलर के लिए अपने मॉड्यूल की आपूर्ति करता है। , पहले ब्लश पर, पाइथन मानक पुस्तकालयों में चीजों को डुप्लिकेट करना प्रतीत होता है।
मुझे लगता है कि यह एक वैचारिक स्तर पर मुड़ने के लिए उपयोगी है, भले ही आप इसे कभी भी उपयोग नहीं करना चाहते हैं। ई आपके थ्रेडिंग, मल्टीप्रोसेसिंग और यहां तक कि सबप्रोसेस हैंडलिंग के साथ-साथ आपके द्वारा किए गए किसी भी वितरित प्रसंस्करण में प्रदर्शन, विवाद, और ईवेंट हैंडलिंग में अंतर्दृष्टि।
(नोट:) भी शामिल कर रहे asyncio (अतुल्यकालिक मैं/हे नया अजगर 3.x के संस्करणों सुविधाओं ऐसे async डीईएफ़, @ async.coroutine डेकोरेटर, और कीवर्ड का इंतजार है, के रूप में और भविष्य से समर्थन से उपज। ये सभी लगभग एक प्रक्रिया (सहकारी मल्टीटास्किंग) परिप्रेक्ष्य से के मुकाबले हैं)।
वितरित विकल्प:
फिर भी आप प्रसंस्करण का एक और दायरे के बारे में नहीं पूछा है, लेकिन जो विचार के लायक है, वितरित प्रसंस्करण का है। वितरित प्रसंस्करण और समांतर गणना के लिए कई पायथन उपकरण और ढांचे हैं। व्यक्तिगत रूप से मुझे लगता है कि उपयोग करने में सबसे आसान वह है जिसे कम से कम उस स्थान में माना जाता है।
Redis के आसपास वितरित प्रसंस्करण का निर्माण करना लगभग मामूली है। पूरे मुख्य स्टोर का उपयोग कार्य इकाइयों और परिणामों को संग्रहीत करने के लिए किया जा सकता है, रेडिस लिस्ट का उपयोग Queue()
के रूप में किया जा सकता है, और PUB/SUB समर्थन Event
-जैसे हैंडलिंग के लिए उपयोग किया जा सकता है। आप अपनी चाबियों को हश कर सकते हैं और रेडिस इंस्टेंस के ढीले क्लस्टर में दोहरा सकते हैं, टोपोलॉजी और हैश-टोकन मैपिंग्स को स्टोर करने के लिए निरंतर हैशिंग और असफलता प्रदान करने के लिए किसी भी एक उदाहरण की क्षमता से परे स्केलिंग के लिए अपने श्रमिकों को समन्वयित करने के लिए और उनमें से मार्शल डेटा (मसालेदार, जेएसओएन, बीएसओएन, या वाईएएमएल)।
बेशक के रूप में आप एक बड़े पैमाने और Redis चारों ओर और अधिक परिष्कृत समाधान का निर्माण करने शुरू कर रहे हैं फिर से लागू करने विशेषताएं है कि पहले से ही प्रयोग, Celery, Apache Spark और Hadoop, Zookeeper, etcd, Cassandra और इतने पर सुलझाई जा सकती के कई । उन सभी में पाइथन की सेवाओं के लिए मॉड्यूल के लिए मॉड्यूल हैं।
[अद्यतन: यदि आप वितरित सिस्टम में कम्प्यूटेशनल रूप से गहन के लिए पाइथन पर विचार कर रहे हैं तो विचार के लिए कुछ संसाधन: IPython Parallel और PySpark। हालांकि ये सामान्य उद्देश्य वितरित कंप्यूटिंग सिस्टम हैं, वे विशेष रूप से सुलभ और लोकप्रिय उपप्रणाली डेटा विज्ञान और विश्लेषण हैं]।
निष्कर्ष
वहाँ आप अजगर के लिए प्रसंस्करण विकल्प, एकल थ्रेड से की सरगम, subprocesses करने के लिए सरल तुल्यकालिक कॉल, सर्वेक्षण में शामिल subprocesses के पूल, पिरोया और बहु, घटना चालित सहकारी बहु के साथ है कार्य, और वितरित प्रसंस्करण के लिए बाहर।
संबंधित: http://stackoverflow.com/questions/1743293/why-does-my-python-program-average-only-33-cpu-per-process-how-can-i-make-pytho/1743312 # 1743312 (यह देखने के लिए मेरा जवाब पढ़ें कि धागे शुद्ध-पायथन कोड के लिए गैर-स्टार्टर क्यों हैं) –
"कोई भी पायथन संस्करण" बहुत अस्पष्ट है। पायथन 2.3? 1.x? 3.x? यह संतुष्ट करने के लिए बस एक असंभव स्थिति है। – detly