2012-07-11 9 views
33

जो मैं यहां करने का प्रयास कर रहा हूं वह प्रोग्राम में सभी चल रहे थ्रेड से बाहर निकलने के लिए कीबोर्ड इंटरप्ट का उपयोग करता है।कीबोर्ड के साथ सभी थ्रेड्स को बंद करना

for i in taskDictionary: 
    try: 
     sleep(60) 
     thread = Thread(target = mainModule.executeThread) 
     thread.start() 
    except KeyboardInterrupt: 
     thread.__stop() 

कार्यक्रम में ही कहीं अधिक जटिल है विभिन्न चर कि धागे को प्रभावित और यहां तक ​​कि एक अनुक्रमिक में लांच करने के लिए विकल्प होने के टन के लिए लेखांकन: यह जहां धागा बनाया जाता है मेरी कोड का एक नीचे मुकाबले संस्करण है मोड, जहां कार्यों को थ्रेड नहीं किया जाता है, लेकिन इसके बजाय एक-एक-एक लॉन्च किया जाता है, इसलिए इस छोटे बदलाव के साथ कुछ समस्याएं हो सकती हैं जिन्हें मैंने अभी स्वीकार किया है। मैंने इसे ऐसे तरीकों से किया है जो 50/50 परिणाम उत्पन्न करते हैं। इंटरप्ट काम करेंगे लेकिन थ्रेड कभी भी बाहर निकल नहीं पाएंगे। कभी-कभी वे आगे बढ़ते रहते थे लेकिन भविष्य के धागे के निष्पादन को रोकते थे, कुछ बार वे बाधा के बारे में एक बड़ी गलती से बाहर निकलते थे, दूसरी बार इंटरप्ट कुछ भी नहीं करेंगे। पिछली बार जब मैंने इसे चलाया तो कार्यक्रम ने किसी भी भविष्य के धागे को निष्पादित करने से रोक दिया लेकिन मौजूदा धागे को नहीं रोका। क्या मॉड्यूल में जाने के बिना धागे से बाहर निकलने का कोई तरीका है थ्रेड वास्तव में निष्पादित हो रहा है?

उत्तर

52

एक समान सवाल यह है कि "आप धागे को कैसे मारते हैं?"

आप अपने धागे में एक निकास हैंडलर बनाते हैं जो थ्रेडिंग मॉड्यूल से लॉक या ईवेंट ऑब्जेक्ट द्वारा नियंत्रित होता है। फिर आप बस लॉक को हटा दें या ईवेंट ऑब्जेक्ट को सिग्नल करें। यह थ्रेड को सूचित करता है कि इसे प्रसंस्करण करना बंद कर देना चाहिए और कृपा से बाहर निकलना चाहिए। अपने मुख्य कार्यक्रम में धागे को सिग्नल करने के बाद, thread.join() विधि main में विधि का उपयोग करना है जो थ्रेड को बंद करने की प्रतीक्षा करेगा।

एक छोटी उदाहरण:

import threading 
import time 

def timed_output(name, delay, run_event): 
    while run_event.is_set(): 
     time.sleep(delay) 
     print name,": New Message!" 


def main(): 
    run_event = threading.Event() 
    run_event.set() 
    d1 = 1 
    t1 = threading.Thread(target = timed_output, args = ("bob",d1,run_event)) 

    d2 = 2 
    t2 = threading.Thread(target = timed_output, args = ("paul",d2,run_event)) 

    t1.start() 
    time.sleep(.5) 
    t2.start() 

    try: 
     while 1: 
      time.sleep(.1) 
    except KeyboardInterrupt: 
     print "attempting to close threads. Max wait =",max(d1,d2) 
     run_event.clear() 
     t1.join() 
     t2.join() 
     print "threads successfully closed" 

if __name__ == '__main__': 
    main() 

आप वास्तव में एक धागा की हत्या की कार्यक्षमता की जरूरत है, बहु का उपयोग करें। यह आपको व्यक्तिगत "प्रक्रियाओं" के लिए SIGTERMs भेजने की अनुमति देता है (यह थ्रेडिंग मॉड्यूल के समान भी है)। आम तौर पर, थ्रेडिंग तब होती है जब आप आईओ-बाउंड होते हैं, और मल्टीप्रोसेसिंग तब होती है जब आप वास्तव में प्रोसेसर-बाध्य होते हैं।

+7

धागे के सहयोग के साथ, आप इसे किसी भी तरह से मार सकते हैं। धागे के सहयोग के बिना, ऐसा करने का कोई सुरक्षित तरीका नहीं है और सभी सड़कों में दर्द होता है। –

+1

शानदार उत्तर! बिल्कुल वही नहीं जो मैं खोज रहा था लेकिन इतना व्यापक था कि मैं जिस तर्क की आवश्यकता थी उसमें तर्क को अनुकूलित करने में सक्षम था! उसके लिए धन्यवाद! – Joe

+1

मैं थ्रेड का उपयोग कर रहा हूं क्योंकि मैं ट्रू लूप के दौरान अनंत नहीं चाहता हूं। यह आपके सभी सीपीयू के समय को बर्बाद कर देता है ... काफी सचमुच। मैंने ऐसा कुछ किया है और नींद के बिना यह एक समय में और एक छोटी सी नींद के साथ **% ** के लिए सीपीयू% 100% तक क्रैंक करता है, यह केवल थोड़ी मदद करता है। क्या ** ** बिना कुछ समय के यह करने का कोई तरीका है? – dylnmc

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