2012-03-29 13 views
6

मैं समानांतर निष्पादन का उपयोग करके एक साधारण पायथन प्रोग्राम को कार्यान्वित करना चाहता था। यह I/O बाध्य है, इसलिए मैंने पाया कि धागे उपयुक्त होंगे (प्रक्रियाओं के विपरीत)। कतार और कांटा के लिए प्रलेखन पढ़ने के बाद, मैंने सोचा कि निम्नलिखित की तरह कुछ काम कर सकता है।os.fork और Queue को समझना। Queue

q = Queue.Queue() 

if os.fork():   # child 
    while True: 
     print q.get() 
else:     # parent 
    [q.put(x) for x in range(10)] 

हालांकि, प्राप्त() कॉल कभी वापस नहीं आती है। मैंने सोचा कि यह एक बार थ्रेड() कॉल निष्पादित करने के बाद वापस आ जाएगा। सूत्रण मॉड्यूल का उपयोग करना, बातों से व्यवहार करते हैं और अधिक की तरह मैं उम्मीद:

q = Queue.Queue() 

def consume(q): 
    while True: 
     print q.get() 

worker = threading.Thread (target=consume, args=(q,)) 
worker.start() 

[q.put(x) for x in range(10)] 

मैं सिर्फ क्यों कांटा दृष्टिकोण एक ही बात नहीं करता है समझ में नहीं आता। मैं क्या खो रहा हूँ?

उत्तर

7

POSIX fork प्रणाली अधिकार, एक नया प्रक्रिया बनाता है बल्कि एक नए धागा ही पता अंतरिक्ष के अंदर से:

कांटा() फ़ंक्शन एक नई प्रक्रिया बनाने जाएगा। [...]

तो Queue अपना पहला उदाहरण में दोहराया गया है, बजाय: नई प्रक्रिया (बच्चे प्रक्रिया) के रूप में नीचे विस्तृत छोड़कर बुला प्रक्रिया (मूल प्रक्रिया) के एक सटीक प्रतिलिपि होगा माता-पिता और बच्चे के बीच साझा किया गया।

आप multiprocessing.Queue बजाय उपयोग कर सकते हैं या बस अपने दूसरे उदाहरण :)

वैसे में की तरह धागे का उपयोग करें, सिर्फ कई कारणों से साइड इफेक्ट isn't good practice के लिए सूची comprehensions का उपयोग कर। आप एक for पाश बजाय का उपयोग करना चाहिए:

for x in range(10): q.put(x) 
+1

+1 'मल्टीप्रोसेसिंग' का उल्लेख करने के लिए +1। –

0

कांटा एक नई प्रक्रिया पैदा करता है। बच्चे और अभिभावक प्रक्रियाएं एक ही कतार साझा नहीं करती हैं: यही कारण है कि माता-पिता द्वारा रखे गए तत्वों को बच्चे द्वारा पुनर्प्राप्त नहीं किया जा सकता है।

1

असंबद्ध प्रक्रियाओं के बीच डेटा साझा करने के लिए, आप नामित पाइप का उपयोग कर सकते हैं। Os.open() funcion के माध्यम से .. http://docs.python.org/2/library/os.html#os.open। आप नामित पाइप नाम = _ my_pipe 'के रूप में आसानी से पाइप नाम कर सकते हैं और एक अलग पायथन प्रोग्राम में os.open (name_pipe,) का उपयोग कर सकते हैं, जहां मोड गलत है और इसी तरह। उसके बाद आप पाइप में लिखने के लिए एक फीफो बना देंगे। पाइप को बंद करना और अपवादों को पकड़ना न भूलें ..