2013-02-27 104 views
45

मेरे पास एक मुख्य प्रक्रिया है जो दो या दो से अधिक उप प्रक्रियाएं बनाती है, मैं मुख्य प्रक्रिया को तब तक इंतजार करना चाहता हूं जब तक कि सभी उप प्रक्रियाएं अपने परिचालन को समाप्त न करें और बाहर निकलें?सभी सबप्रोसेस खत्म होने तक प्रतीक्षा प्रक्रिया?

# main_script.py 

p1 = subprocess.Popen(['python script1.py']) 
p2 = subprocess.Popen(['python script2.py']) 
... 
#wait main process until both p1, p2 finish 
... 
+4

प्रतीक्षा विधि का उपयोग करें: 'p1.wait(); p2.wait() ' –

+1

इस प्रश्न को जांचें: http://stackoverflow.com/questions/6341358/subprocess-wait-not-waiting-for-popen-process-to-finish-when-using-threads – Calum

+2

http: //stackoverflow.com/questions/100624/python-on-windows-how-to-wait-for-multiple-child-processes – Gjordis

उत्तर

69

एक Popen वस्तु एक .wait() विधि वास्तव में इस के लिए परिभाषित किया गया है: एक दिया उपप्रक्रिया के पूरा होने के लिए प्रतीक्षा करने के लिए (और, के अलावा , बाहर निकलने की स्थिति को फिर से शुरू करने के लिए)।

यदि आप इस विधि का उपयोग करते हैं, तो आप इसे रोक देंगे कि प्रक्रिया ज़ोंबी बहुत लंबे समय तक झूठ बोल रही हैं।

(वैकल्पिक रूप से, आप subprocess.call() या subprocess.check_call() बुला और इंतजार कर। जब आप यह प्रक्रिया आईओ की जरूरत नहीं है के लिए उपयोग कर सकते हैं, वह पर्याप्त हो सकता है। लेकिन शायद इस एक विकल्प नहीं है, क्योंकि आपके अगर दो subprocesses करने लगते हैं समानांतर में चलाने के लिए, जो वे नहीं के साथ (check_) call()।)

आप के लिए प्रतीक्षा करने के लिए कई subprocesses है, तो आप क्या कर सकते हैं होगा माना जा

exit_codes = [p.wait() for p in p1, p2] 

जो के रूप में जल्द ही सभी subprocesses है के रूप में देता है ख़त्म होना। फिर आपके पास रिटर्न कोड की एक सूची है जिसका आप मूल्यांकन कर सकते हैं।

+6

सवाल यह था कि * सभी * सबप्रोसेसेस के लिए कैसे इंतजार करना है, केवल एक ही नहीं। –

+2

@ ग्रेगवार्ड अगर मैं कई चीजों की प्रतीक्षा करता हूं, तो मैं लगातार सभी के लिए इंतजार कर सकता हूं। विशेष रूप से इस स्थिति में। – glglgl

+2

और मुझे नहीं लगता कि केवल इस विवरण के गायब होने से जवाब अनुपयोगी हो जाता है। – glglgl

12
subprocess.call 

स्वचालित रूप से इंतजार कर रहा है, तो आप भी उपयोग कर सकते हैं:

p1.wait()