2011-12-21 11 views
5

मैं सीख रहा हूं कि हाल ही में पाइथन मल्टीप्रोसेसिंग मॉड्यूल का उपयोग कैसे करें और आधिकारिक दस्तावेज़ पढ़ना। 16.6.1.2. Exchanging objects between processes में डेटा का आदान-प्रदान करने के लिए पाइप का उपयोग करने के बारे में एक सरल उदाहरण है।पायथन मल्टीप्रोसेसिंग पाइप आरईवी() डॉक्टर अस्पष्ट है या क्या मुझे कुछ याद आया?

और 16.6.2.4. Connection Objects में,, इस बयान है, उद्धृत "वृद्धि EOFError अगर वहाँ कुछ भी नहीं प्राप्त करने के लिए और दूसरे छोर बंद हो गया छोड़ दिया है।"

तो, मैंने नीचे दिखाए गए उदाहरण को संशोधित किया है। IMHO को EOFError अपवाद ट्रिगर करना चाहिए: कुछ भी नहीं भेजा गया है और भेजने का अंत बंद है।

संशोधित कोड:

from multiprocessing import Process, Pipe 

def f(conn): 
    #conn.send([42, None, 'hello']) 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 
    #print parent_conn.recv() # prints "[42, None, 'hello']" 
    try: 
     print parent_conn.recv() 
    except EOFError: 
     pass 
    p.join() 

लेकिन, जब मैं अपने उबंटू 11.04 मशीन, पायथन 2.7.2 पर संशोधित उदाहरण की कोशिश की, स्क्रिप्ट लटका।

यदि कोई मुझे बता सकता है कि मुझे क्या याद आया, तो मैं बहुत सराहना करता हूं।

+0

कृपया निकालें "या बग है।" एक बग की संभावना लगभग शून्य है। संभावित स्पष्टीकरण पर ध्यान केंद्रित करें - गलत या अस्पष्ट दस्तावेज़ीकरण। –

+0

@ एसएलॉट, आप सही थे। यह मेरी निगरानी है - बिलकुल भी नहीं। पाइथन के संदर्भ गिनती, और डुप्लेक्स पाइप का उपयोग करने का सबसे अच्छा अभ्यास के बारे में भूल गए। – user183394

उत्तर

8

जब आप mp.Process के साथ एक नई प्रक्रिया शुरू करते हैं, तो बच्चे की प्रक्रिया माता-पिता के पाइप को प्राप्त करती है। जब बच्चा conn बंद करता है, तो मूल प्रक्रिया में अभी भी child_conn खुला है, इसलिए पाइप फ़ाइल डिस्क्रिप्टर के लिए संदर्भ गणना अभी भी 0 से अधिक है, और इसलिए EOFError नहीं उठाया गया है।

EOFError पाने के लिए, दोनों माता पिता और बच्चे की प्रक्रिया में पाइप के अंत बंद:

import multiprocessing as mp 

def foo_pipe(conn): 
    conn.close() 

def pipe(): 
    conn = mp.Pipe() 
    parent_conn, child_conn = conn 
    proc = mp.Process(target = foo_pipe, args = (child_conn,)) 
    proc.start() 
    child_conn.close() # <-- Close the child_conn end in the main process too. 
    try: 
     print(parent_conn.recv()) 
    except EOFError as err: 
     print('Got here') 
    proc.join() 

if __name__=='__main__': 
    pipe() 
संबंधित मुद्दे