2013-06-18 5 views
12

का उपयोग करते हुए यह एक नौसिखिया सवाल यह है:पायथन के multiprocessing.Process वर्ग

एक वर्ग एक वस्तु है, तो मैं एक वर्ग pippo() और इस ऐड समारोह और पैरामीटर के अंदर बुलाया बना सकते हैं, मैं अगर कार्यों समझ में नहीं आता pippo के अंदर नीचे से ऊपर से क्रियान्वित कर रहे हैं जब मैं x=pippo() असाइन करें या मैं उन्हें pippo की x.dosomething() बाहर के रूप में कॉल करना होगा।

पायथन के बहु पैकेज के साथ काम करते हुए, यह एक बड़ा समारोह को परिभाषित करने और Process() करने के लिए कॉल में target तर्क का उपयोग वस्तु बनाने, या Process वर्ग से इनहेरिट द्वारा अपनी खुद की प्रक्रिया वर्ग बनाने के लिए करने के लिए बेहतर है?

+0

अपने प्रश्न के पहले भाग के लिए, अगर आप चाहते हैं एक समारोह जब एक वस्तु instantiated है तो आप कक्षाएं '__init__' समारोह में इसे करने के लिए एक कॉल कर सकते हैं निष्पादित किया जाना है। आप भी [संपत्ति सजावट] (http://docs.python.org/2/library/functions.html#property) भी कर सकते हैं। मुझे यकीन नहीं है कि आप दूसरे भाग में क्या पूछ रहे हैं। क्या आप स्पष्टीकरण दे सकते हैं? –

+0

अक्सर आप ऑब्जेक्ट के संदर्भ के माध्यम से क्लास विधियों का आह्वान करेंगे, जैसे 'x.doSomthing() '। जैसे ही ऑब्जेक्ट को क्लास '__init__' विधि से बुलाया जाता है, आप आंतरिक रूप से विधियों का उपयोग भी कर सकते हैं। यदि आप ऑब्जेक्ट के तरीकों को "प्रक्रिया के रूप में चलाने" के लिए चाहते हैं, तो ऐसा करने के कई तरीके हैं। मेरा व्यक्तिगत पसंदीदा 'प्रक्रिया' से उपclass है। मैं इसे यहां करने का एक तरीका बताता हूं: http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH

उत्तर

23

मुझे अक्सर आश्चर्य हुआ कि multiprocessing पर पाइथन का दस्तावेज़ पृष्ठ केवल "कार्यात्मक" दृष्टिकोण दिखाता है (target पैरामीटर का उपयोग करके)। शायद क्योंकि terse, संक्षेप कोड स्निपेट चित्रण उद्देश्यों के लिए सबसे अच्छे हैं। छोटे कार्यों कि एक समारोह में फिट के लिए, मैं देख सकते हैं कि कि पसंदीदा तरीका, आला है:

from multiprocessing import Process 

def f(): 
    print('hello') 

p = Process(target=f) 
p.start() 
p.join() 

लेकिन जब आप अधिक से अधिक कोड संगठन (जटिल कार्यों के लिए) की जरूरत है, अपने स्वयं के वर्ग बनाने जाने का रास्ता है :

from multiprocessing import Process 

class P(Process): 
    def __init__(self): 
     super(P, self).__init__() 
    def run(self): 
     print('hello') 

p = P() 
p.start() 
p.join() 

ध्यान रखें कि प्रत्येक स्पॉन्डेड प्रक्रिया मास्टर प्रक्रिया के स्मृति पदचिह्न की एक प्रति के साथ शुरू की जाती है। और यह कि कन्स्ट्रक्टर कोड (यानी __init__() के अंदर सामान) मास्टर प्रक्रिया में निष्पादित किया गया है - केवल run() के अंदर कोड अलग प्रक्रियाओं में निष्पादित करता है।

इसलिए, यदि एक प्रक्रिया (मास्टर या पैदा की) बदलता है यह सदस्य चर, परिवर्तन अन्य प्रक्रियाओं में परिलक्षित नहीं किया जाएगा। यह, बेशक, bool, string, list, आदि जैसे बुलेट-इन प्रकारों के लिए केवल सत्य है। हालांकि आप multiprocessing मॉड्यूल से "विशेष" डेटा संरचनाएं आयात कर सकते हैं जिन्हें पारदर्शी रूप से प्रक्रियाओं के बीच साझा किया जाता है (Sharing state between processes देखें।) या, आप आईपीसी (इंटर-प्रोसेस संचार) जैसे multiprocessing.Pipe और multiprocessing.Queue के अपने स्वयं के चैनल बना सकते हैं।

+2

मल्टीप्रोसेसिंग आवश्यकता नहीं है 'अगर __name__ ==" __main __ "' यदि आप विंडोज़ पर चल रहे हैं? –

+0

पर ध्यान देने के लिए बस एक और आश्चर्य है यदि स्पॉन्ड प्रक्रिया ने अपनी कक्षा में कुछ डेटा प्रकारों को बदल दिया है तो क्या वे परिवर्तन मास्टर प्रक्रिया से दिखाई देंगे? – Woody1193

+0

@ वुडी 11 9 3, अंतर्निहित डेटा प्रकारों के लिए नहीं। लेकिन यदि आप 'मल्टीप्रोसेसिंग' मॉड्यूल से विशेष साझा डेटाटाइप का उपयोग करते हैं, तो आपको वांछित प्रभाव मिलेगा। (मैंने उपरोक्त मेरे उत्तर में यह स्पष्टीकरण जोड़ा।) –

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