2010-08-18 6 views
9

चारों ओर पाने के लिए अजगर में सी एक्सटेंशन का उपयोग करने मैं कई कोर भर में अजगर में एक सीपीयू गहन कार्यक्रम चलाना चाहते हैं और कर रहा हूँ यह पता लगाने कैसे सी एक्सटेंशन यह करने के लिए लिखने के लिए कोशिश कर रहा। क्या इस पर कोई कोड नमूने या ट्यूटोरियल हैं?कैसे जीआईएल

उत्तर

-1

आप mpi4py तरह अजगर एमपीआई पुस्तकालयों में से एक का उपयोग कर विचार किया है? हालांकि एमपीआई आमतौर पर क्लस्टर में काम वितरित करने के लिए प्रयोग किया जाता है, यह एक मल्टीकोर मशीन पर काफी अच्छी तरह से काम करता है। नकारात्मकता यह है कि आपको एमपीआई की संचार कॉल का उपयोग करने के लिए अपने कोड को दोबारा करना होगा (जो आसान हो सकता है)।

7

multiprocessing पर एक नजर डालें। यह अक्सर अनदेखा तथ्य है कि वैश्विक रूप से डेटा साझा नहीं कर रहा है, और एक ही प्रक्रिया में धागे के भार को क्रैमिंग नहीं करना ऑपरेटिंग सिस्टम पसंद करते हैं।

आप अभी भी जोर देते हैं कि अपने CPU गहन व्यवहार सूत्रण की आवश्यकता है, working with the GIL in C के लिए दस्तावेज़ पर एक नज़र डालें। यह काफी जानकारीपूर्ण है।

+0

मल्टीप्रोसेसिंग बनाम थ्रेडिंग का उपयोग करने की कोशिश करने के साथ में सबसे बड़ी समस्या यह है कि 1000+ धागे (प्रक्रियाओं) को चलाने की कोशिश करने के साथ यह है कि आपको प्रत्येक के साथ पायथन दुभाषिया का एक अलग उदाहरण मिलता है। यह स्मृति के मामले में बेहद महंगा हो जाता है। – Andy

+0

@nalroff: यह सही नहीं लगता है। दुभाषिया के बहुमत के लिए उपयोग की जाने वाली स्मृति को उस दुभाषिया के सभी उदाहरणों द्वारा साझा किया जाता है। केवल अलग-अलग पृष्ठ ही कुल मेमोरी उपयोग को बढ़ाएंगे। सुनिश्चित करें कि आप सही मूल्य देख रहे हैं।यह ध्यान देने योग्य भी है कि प्रक्रियाएं अतिरिक्त धागे की तुलना में काफी अधिक स्मृति का उपयोग नहीं करती हैं। –

+0

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

9

आप पहले से ही कई प्रक्रियाओं में एक पायथन प्रोग्राम तोड़ सकते हैं। ओएस पहले से ही सभी कोरों में आपकी प्रक्रिया आवंटित करेगा।

ऐसा करें।

python part1.py | python part2.py | python part3.py | ... etc. 

ओएस यह सुनिश्चित करेगा कि वह हिस्सा जितना संभव हो उतना संसाधनों का उपयोग करेगा। sys.stdin और sys.stdout पर आप इस पाइपलाइन के साथ जानकारी को तीन गुना पास कर सकते हैं।

बहुत ज्यादा काम के बिना

, यह अक्सर नाटकीय speedups हो सकता है।

हाँ - haterz करने के लिए - यह इतना अत्याचार है कि यह बहुत तेज नहीं किया जा सकता एक एल्गोरिथ्म के निर्माण के लिए संभव है। हालांकि, यह अक्सर न्यूनतम काम के लिए भारी लाभ पैदा करता है।

और।

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

1

यह सी एक्सटेंशन का एक अच्छा उपयोग है। जिस कीवर्ड को आप खोजना चाहते हैं वह Py_BEGIN_ALLOW_THREADS है।

http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock

पी.एस. मेरा मतलब है कि यदि आप पहले से ही सी में प्रसंस्करण कर रहे हैं, जैसे इमेजिंग प्रोसेसिंग, तो सी एक्सटेंशन में लॉक जारी करना अच्छा है। यदि आपका प्रसंस्करण कोड मुख्य रूप से पायथन में है, तो multiprocessing पर अन्य लोगों का सुझाव बेहतर है। आमतौर पर पृष्ठभूमि प्रसंस्करण के लिए सी में कोड को फिर से लिखना उचित नहीं है।

-1

मल्टीप्रोसेसिंग आसान है। यदि वह पर्याप्त तेज़ नहीं है, तो आपका प्रश्न जटिल है।