2009-08-05 28 views
36
import multiprocessing 
import time 

class testM(multiprocessing.Process): 

    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     self.exit = False 

    def run(self): 
     while not self.exit: 
      pass 
     print "You exited!" 
     return 

    def shutdown(self): 
     self.exit = True 
     print "SHUTDOWN initiated" 

    def dostuff(self): 
     print "haha", self.exit 


a = testM() 
a.start() 
time.sleep(3) 
a.shutdown() 
time.sleep(3) 
print a.is_alive() 
a.dostuff() 
exit() 

मैं बस सोच रहा हूं कि उपरोक्त कोड वास्तव में "आप बाहर निकलने" को कैसे प्रिंट नहीं करता है। मैं क्या गलत कर रहा हूं? यदि हां, तो क्या कोई मुझे शानदार तरीके से बाहर निकलने के लिए सही तरीके से इंगित कर सकता है? (मैं process.terminate या kill का जिक्र नहीं कर रहा हूं)पाइथन मल्टीप्रोसेसिंग से बाहर निकलें कैसे?

+0

वास्तव में, यह सब कोड आप के रूप में-एक NameError है, क्योंकि आप वर्ग निर्माण के दौरान वर्ग का दृष्टांत की कोशिश कर रहे देना चाहिए:

निम्नलिखित कोड का प्रयास करें। दूसरे शब्दों में: आप शायद पिछले आठ लाइनों को समर्पित करना चाहते हैं। – balpha

+1

नोट: यह उदाहरण कोड Win32 पर असफल हो जाएगा क्योंकि आपने मुख्य स्क्रिप्ट कोड को गार्ड क्लॉज से सुरक्षित नहीं किया है: 'if __name__ ==" __main__ ": ... – jkp

उत्तर

39

कारण यह नहीं है कि आप ऐसा नहीं देख रहे हैं क्योंकि आप उपप्रजाति से संचार नहीं कर रहे हैं। आप बच्चे को सिग्नल करने के लिए संकेत देने के लिए एक स्थानीय चर (मूल प्रक्रिया के लिए स्थानीय) का उपयोग करने की कोशिश कर रहे हैं।

synchonization primatives पर जानकारी पर नज़र डालें। आपको किसी प्रकार का सिग्नल सेट अप करने की आवश्यकता है जिसे दोनों प्रक्रियाओं में संदर्भित किया जा सकता है। एक बार आपके पास यह हो जाने के बाद आप पैरेंट प्रक्रिया में स्विच फ्लिक करने में सक्षम होना चाहिए और बच्चे को मरने की प्रतीक्षा करनी चाहिए।

import multiprocessing 
import time 

class MyProcess(multiprocessing.Process): 

    def __init__(self,): 
     multiprocessing.Process.__init__(self) 
     self.exit = multiprocessing.Event() 

    def run(self): 
     while not self.exit.is_set(): 
      pass 
     print "You exited!" 

    def shutdown(self): 
     print "Shutdown initiated" 
     self.exit.set() 


if __name__ == "__main__": 
    process = MyProcess() 
    process.start() 
    print "Waiting for a while" 
    time.sleep(3) 
    process.shutdown() 
    time.sleep(3) 
    print "Child process state: %d" % process.is_alive() 
+0

thx man, मैं बस एपीआई देख रहा था VALUE, और मुझे नहीं लगता कि यह उत्परिवर्तनीय है। यह मेरे ऐप में बहुत अच्छा काम करेगा। Thx बहुत –

+3

शट डाउन कॉल करने के 3 सेकंड बाद प्रतीक्षा करने के बजाय (अगर इसे बंद करने के लिए 3 से अधिक समय लगता है), तो प्रक्रिया पूरी होने पर प्रक्रिया से जुड़ने के लिए आप प्रक्रिया में शामिल हो सकते हैं -> process.join() –

+0

मैंने अभी पीछा किया उसका मूल उदाहरण: मैं बिल्कुल इंतजार नहीं करता! (मैं वही करता हूं जो आपने सुझाया था)। – jkp

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