2011-05-12 11 views
11
from multiprocessing import Process 
# c is a container 
p = Process(target = f, args = (c,)) 
p.start() 

मुझे लगता है c की गहरी प्रतिलिपि f कार्य करने के लिए क्योंकि उथले प्रति एक नई प्रक्रिया के मामले में कोई मतलब नहीं होगा पारित हो जाता है (नई प्रक्रिया बुला प्रक्रिया से डेटा तक पहुँच नहीं है)।पायथन मल्टीप्रोसेसिंग तर्क: गहरी प्रतिलिपि?

लेकिन यह गहरी प्रति कैसे परिभाषित की जाती है? दस्तावेज में एक संपूर्ण set of notes है, क्या ये सभी नोट भी यहां लागू होते हैं? multiprocessing प्रलेखन कुछ भी नहीं ...

उत्तर

9

जब आप एक Process इंस्टेंस बनाएं हुड के नीचे अजगर जारी करता है एक fork() कहते हैं। यह एक बाल प्रक्रिया बनाता है जिसका स्मृति स्थान अपने माता-पिता की एक सटीक प्रति है - इसलिए कांटा के समय मौजूद सभी चीजें की प्रतिलिपि बनाई गई हैं।

लिनक्स पर यह "कॉपी-ऑन-राइट" के माध्यम से कुशल बना दिया गया है। fork man page से:

कांटा() एक बच्चे प्रक्रिया है कि माता पिता प्रक्रिया केवल अपने पीआईडी ​​और PPID में, और वास्तव में कि संसाधन utilizations 0. फ़ाइल ताले और लंबित करने के लिए सेट कर रहे हैं से अलग है बनाता है सिग्नल विरासत में नहीं हैं।

लिनक्स के तहत, कांटा() प्रति-ऑन-राइट पृष्ठों का उपयोग कार्यान्वित किया जाता है, इसलिए केवल दंड है कि यह पड़ता है समय और स्मृति माता पिता के पृष्ठ सारणी नकल करने, और एक अद्वितीय बनाने के लिए आवश्यक है बच्चे के लिए कार्य संरचना।

+0

+1। ध्यान दें कि विंडोज 'फोर्क() 'की तुलना में एक अलग तंत्र का उपयोग करता है, लेकिन प्रभाव समान हैं। –

+0

यह सही है, लेकिन किसी को यह उल्लेख करना है कि यह सच नहीं है कि कुछ भी कॉपी नहीं हुआ है। पायथन के कचरा कलेक्टर को रेफ मायने रखरखाव की जरूरत है। इसके लिए स्मृति ओवरहेड नगण्य है हालांकि (मुझे लगता है कि प्रत्येक प्रक्रिया के लिए 4kb)। –

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