2010-04-13 19 views
72

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

पोर्टेबिलिटी महत्वपूर्ण है, जिसमें मैं इसे मैक, लिनक्स और विंडोज पर किसी भी पायथन संस्करण पर चलाने के लिए चाहता हूं। इन बाधाओं को देखते हुए, यह लागू करने के लिए सबसे उपयुक्त पायथन मॉड्यूल कौन सा है? मैं थ्रेड, सबप्रोसेस, और मल्टीप्रोसेसिंग के बीच निर्णय लेने की कोशिश कर रहा हूं, जो सभी संबंधित कार्यक्षमता प्रदान करते हैं।

इस पर कोई विचार? मुझे पोर्टेबल का सबसे आसान समाधान चाहिए।

+0

संबंधित: http://stackoverflow.com/questions/1743293/why-does-my-python-program-average-only-33-cpu-per-process-how-can-i-make-pytho/1743312 # 1743312 (यह देखने के लिए मेरा जवाब पढ़ें कि धागे शुद्ध-पायथन कोड के लिए गैर-स्टार्टर क्यों हैं) –

+1

"कोई भी पायथन संस्करण" बहुत अस्पष्ट है। पायथन 2.3? 1.x? 3.x? यह संतुष्ट करने के लिए बस एक असंभव स्थिति है। – detly

उत्तर

46

multiprocessing मॉड्यूल का एक महान स्विस-सेना चाकू प्रकार है। यह धागे से अधिक सामान्य है, क्योंकि आप रिमोट कंप्यूटेशंस भी कर सकते हैं। इसलिए यह मॉड्यूल है जिसका सुझाव है कि आप इसका उपयोग करेंगे।

subprocess मॉड्यूल आपको कई प्रक्रियाओं को लॉन्च करने की अनुमति देगा, लेकिन मुझे नए मल्टीप्रोसेसिंग मॉड्यूल की तुलना में उपयोग करने में कम सुविधाजनक लगता है।

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

मेरा मानना ​​है कि आपके द्वारा उद्धृत तीन मॉड्यूल के अधिकांश कार्यों का उपयोग मंच-स्वतंत्र तरीके से किया जा सकता है। पोर्टेबिलिटी पक्ष पर, ध्यान दें कि multiprocessing केवल पायथन 2.6 के बाद मानक में आता है (हालांकि पाइथन के कुछ पुराने संस्करणों के लिए एक संस्करण मौजूद है)। लेकिन यह एक महान मॉड्यूल है!

+1

, मैंने अभी "मल्टीप्रोसेसिंग" मॉड्यूल और इसकी pool.map() विधि का उपयोग किया है। केक का टुकड़ा ! – kmonsoor

+2

डाउनवोट क्यों? – EOL

3

सीपीथॉन में एकाधिक प्रोसेसर का उपयोग करने के लिए आपके केवल विकल्प multiprocessing मॉड्यूल है। सीपीथन अपने आंतरिक पर एक ताला रखता है (GIL) जो समानांतर में काम करने के लिए अन्य सीपीयू पर धागे को रोकता है। multiprocessing मॉड्यूल नई प्रक्रियाएं बनाता है (जैसे subprocess) और उनके बीच संचार प्रबंधित करता है।

+4

यह सच नहीं है, AFAIK आप सीआईपी का उपयोग कर जीआईएल जारी कर सकते हैं, और आयरनपीथन या ज्योथन जैसे पाइथन के अन्य कार्यान्वयन हैं जो ऐसी सीमाओं से ग्रस्त नहीं हैं। हालांकि मैंने डाउनवोट नहीं किया था। एक असाइनमेंट के लिए –

3

इसी तरह से मैंने अलग प्रक्रियाओं और छोटे संचार आवश्यक नेटवर्क सॉकेट का चयन किया। यह बहुत पोर्टेबल है और पाइथन का उपयोग करने के लिए काफी सरल है, लेकिन शायद आसान नहीं है (मेरे मामले में मुझे एक और बाधा थी: सी ++ में लिखी गई अन्य प्रक्रियाओं के साथ संचार)।

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

1

शैल बाहर और करने के लिए अपने काम यूनिक्स बाहर जाने:

उपयोग iterpipes उपप्रक्रिया और फिर रैप करने के लिए:

From Ted Ziuba's site

INPUTS_FROM_YOU | xargs -n1 -0 -P NUM।/ प्रक्रिया #NUM समानांतर प्रक्रियाओं

या

Gnu Parallel भी की सेवा

आप जीआईएल साथ मौज-मस्ती होगा, जबकि आप बैकरूम लड़कों बाहर भेजने अपने मल्टीकोर काम करने के लिए।

+6

"पोर्टेबिलिटी महत्वपूर्ण है, जिसमें मैं इसे मैक, लिनक्स और विंडोज पर किसी भी पायथन संस्करण पर चलाने के लिए चाहता हूं।" – detly

+0

इस समाधान के साथ, क्या आप नौकरी के साथ बार-बार बातचीत कर सकते हैं? आप इसे मल्टीप्रोसेसिंग में कर सकते हैं, लेकिन मुझे उपप्रोसेसर में ऐसा नहीं लगता है। – abalter

126

मेरे लिए यह वास्तव में बहुत सरल है:

उपप्रक्रिया विकल्प:

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 के पूल, पिरोया और बहु, घटना चालित सहकारी बहु के साथ है कार्य, और वितरित प्रसंस्करण के लिए बाहर।

+1

कक्षाओं/ओओपी के साथ मल्टीप्रोसेसिंग का उपयोग करना मुश्किल है। – Tjorriemorrie

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