2015-06-17 6 views
8

पर पाइथन मल्टीप्रोसेसिंग रनटाइमरर मेरे पास एक क्लास फ़ंक्शन है (चलिए इसे "अल्फा.py" कहते हैं) जो मल्टीप्रोसेसिंग (प्रक्रिया = 2) का उपयोग प्रक्रिया को फोर्क करने के लिए करता है और मैंने जो पायथन पैकेज लिखा है उसका हिस्सा है। एक अलग पायथन लिपि में (चलिए इसे "beta.py" कहते हैं), मैंने इस वर्ग से ऑब्जेक्ट को तुरंत चालू किया और मल्टीप्रोसेसिंग का उपयोग करने वाले संबंधित फ़ंक्शन को बुलाया। आखिरकार, यह सब एक रैपर पायथन लिपि के अंदर लपेटा गया है (चलिए इसे "gamma.py" कहते हैं) जो कई अलग-अलग वर्ग वस्तुओं और कार्यों को संभालता है।विंडोज

मूलतः

:

कमांड लाइन से
  1. भागो ./gamma.py
  2. gamma.py उपप्रक्रिया उपयोग करता है और कार्यान्वित beta.py
  3. beta.py alpha.py वर्ग से एक वस्तु को दर्शाता है और मल्टीप्रोसेसिंग (प्रक्रिया = 2)

का उपयोग करने वाले फ़ंक्शन को कॉल करता है इसमें मैक या लिनक्स पर कोई समस्या नहीं चल रही है। हालांकि, यह एक Windows मशीन और त्रुटि (और प्रलेखन) पर एक समस्या का सुझाव हो जाता है कि मैं इस कहीं लिखना चाहिए:

if __name__ == '__main__': 
    freeze_support() 

This other post भी ही बात कर का उल्लेख है।

हालांकि, मुझे नहीं पता कि ये दो पंक्तियां कहाँ रहनी चाहिए। वर्तमान में, न तो alpha.py, beta.py, या gamma.py में if __name__ == '__main__': अनुभाग है। यह बहुत अच्छा होगा अगर कोई मुझे बता सके कि इन दो पंक्तियों को कहाँ जाना चाहिए और इसके पीछे तर्क भी होना चाहिए।

+0

क्या आप इसके साथ प्राप्त एक त्रुटि संदेश की आपूर्ति कर सकते हैं? स्टैक ट्रेस? क्या आपने इसे हल किया था। मुझे आश्चर्य है कि इसका कोई जवाब नहीं था। –

उत्तर

2

दरअसल, freeze_support() यहां आवश्यक नहीं है। आपको RuntimeError मिलता है क्योंकि आप अपने beta मॉड्यूल के शीर्ष स्तर पर अपनी नई प्रक्रियाएं बनाते हैं और शुरू करते हैं।

जब Windows पर multiprocessing का उपयोग करके एक नई प्रक्रिया बनाई जाती है, तो इस प्रक्रिया में एक नया पायथन दुभाषिया शुरू किया जाएगा और यह लक्ष्य कार्य के साथ मॉड्यूल को आयात करने का प्रयास करेगा जिसे निष्पादित किया जाना चाहिए। यह आपका beta मॉड्यूल है। अब, जब आप इसे आयात करते हैं, तो आपके सभी शीर्ष स्तर के कथन निष्पादित किए जाने चाहिए जो एक नई प्रक्रिया को बनाए जाने और फिर से शुरू करने का कारण बनेंगे। और फिर, पुनरावर्ती, उस प्रक्रिया से एक और प्रक्रिया, और इतने पर और आगे।

यह संभवतः आप जो चाहते हैं वह नहीं है, इस प्रकार नई प्रक्रियाओं को आरंभ किया जाना चाहिए और केवल एक बार शुरू किया जाना चाहिए, जब आप सीधे subprocess के साथ beta.py चलाते हैं।

if __name__ == '__main__': beta.py में रखा जाना चाहिए, फिर प्रारंभिक स्थानांतरित करें और इस अनुभाग में अपनी नई प्रक्रियाओं के लिए कोड प्रारंभ करें। उसके बाद, जब beta.py आयात किया जाएगा और सीधे नहीं चलाया जाएगा, तो कोई नई प्रक्रिया शुरू नहीं की जाएगी और आपको कोई साइड इफेक्ट नहीं दिखाई देगा।