5

में लंबे समय से चलने वाली बैच प्रक्रिया को प्रोग्रामेटिक रूप से निष्पादित और समाप्त करना मैं पाइथन में एक लंबी दौड़ वाली "बैच नौकरियां" शुरू करने और समाप्त करने का एक तरीका खोज रहा हूं। अभी मैं प्रत्येक बच्चे की प्रक्रिया के अंदर एक लंबी दौड़ वाली बैच नौकरी लॉन्च करने के लिए "ओएससिस्टम()" का उपयोग कर रहा हूं। जैसा कि आपने अनुमान लगाया होगा, "ओएससिस्टम()" उस बच्चे की प्रक्रिया (दादा प्रक्रिया?) के अंदर एक नई प्रक्रिया पैदा करता है, इसलिए मैं ग्रैंड-पैरेंट प्रक्रिया से बैच नौकरी को मार नहीं सकता। मैं सिर्फ क्या वर्णन किया है के कुछ दृश्य प्रदान करने के लिए:पायथन

Main (grandparent) process, with PID = AAAA 
      | 
      |------> child process with PID = BBBB 
         | 
         |------> os.system("some long-running batch file) 
            [grandchild process, with PID = CCCC] 

तो, मेरी समस्या मैं दादा-दादी से पोता प्रक्रिया को नहीं मार सकता है ...

मेरा प्रश्न है, वहाँ एक रास्ता एक शुरू करने के लिए है बाल प्रक्रिया के अंदर लंबी दौड़ वाली बैच नौकरी, और केवल बच्चे की प्रक्रिया को समाप्त करके उस बैच नौकरी को मारने में सक्षम होना? os.system() के विकल्प क्या हैं जिनका उपयोग मैं कर सकता हूं ताकि मैं मुख्य प्रक्रिया से बैच-नौकरी को मार सकूं?

धन्यवाद !!

उत्तर

2

यदि आप पॉज़िक्स-संगत सिस्टम (उदा।, लिनक्स या ओएस एक्स) पर हैं और बच्चे प्रक्रिया के बाद कोई पायथन कोड चलाना नहीं है, तो os.execv का उपयोग करें। सामान्य रूप से, os.system से बचें और इसके बजाय subprocess मॉड्यूल का उपयोग करें।

-1

यदि आप बाल प्रक्रियाओं की शुरुआत और रोक पर नियंत्रण चाहते हैं तो आपको थ्रेडिंग का उपयोग करना होगा। उस स्थिति में, पाइथन के threading मॉड्यूल से आगे देखो।

3

subprocess मॉड्यूल पायथन में प्रक्रियाओं को बढ़ाने और नियंत्रित करने का उचित तरीका है।

डॉक्स से

:

उपप्रक्रिया मॉड्यूल अंडे नई प्रक्रियाओं के लिए आप की अनुमति देता है, उनके इनपुट/आउटपुट/त्रुटि पाइप से कनेक्ट, और उनकी वापसी कोड प्राप्त करते हैं। इस मॉड्यूल जैसे कई अन्य, बड़े मॉड्यूल और कार्यों, की जगह का इरादा रखता है: os.spawn
os.popen
popen2
आदेशों

तो

os.system
.. यदि आप पाइथन 2.4+ पर हैं, subprocessos.system

प्रक्रियाओं को रोकने के लिए प्रतिस्थापन है, तो चेक करें terminate() और communicate()Popen ऑब्जेक्ट्स के तरीके।