2010-11-09 17 views
19

में थ्रेड को मारने के लिए अंतराल मैं कहीं पढ़ता हूं कि कीबोर्ड इंटरप्ट अपवाद केवल पायथन में मुख्य धागे द्वारा पढ़ा जाता है। मैंने यह भी पढ़ा कि बाल थ्रेड निष्पादित होने पर मुख्य धागा अवरुद्ध है। तो, इसका मतलब यह है कि CTRL + सी कभी भी बच्चे के धागे तक नहीं पहुंच सकता है। मैं निम्नलिखित कोड की कोशिश की:Ctrl-c i.e. कीबोर्ड Pyteron

def main(): 
    try: 
     thread1.start() #thread is totally blocking e.g. while (1) 
     thread1.join() 
    except KeyboardInterrupt: 
     print "Ctrl-c pressed ..." 
     sys.exit(1) 

इस मामले में वहाँ निष्पादन पर CTRL + सी का कोई प्रभाव नहीं है। ऐसा लगता है कि यह बाधा को सुनने में सक्षम नहीं है। क्या मैं इसे गलत तरीके से समझ रहा हूं? CTRL + सी का उपयोग कर धागे को मारने का कोई अन्य तरीका है?

+0

http://stackoverflow.com/questions/323972/is-there देखें -any-way-to-kill-a-thread-in-python –

+5

आपका मुख्य धागा अवरुद्ध नहीं है क्योंकि आप एक और धागा शुरू करते हैं। धागे का बिंदु क्या होगा यदि यह सच था? ऐसा इसलिए है क्योंकि आप thread1.join() को कॉल कर रहे हैं, जो थ्रेड 1 पूरा होने तक ब्लॉक करता है। – Falmarri

उत्तर

9

समस्या यह है कि आप thread1.join() का उपयोग कर रहे हैं, जिससे आपके प्रोग्राम को तब तक इंतजार करना पड़ेगा जब तक कि थ्रेड जारी न हो जाए।

सिग्नल हमेशा मुख्य प्रक्रिया द्वारा पकड़े जाएंगे, क्योंकि यह सिग्नल प्राप्त करने वाला व्यक्ति है, यह प्रक्रिया है जिसमें धागे हैं।

जैसा कि आप दिखाते हैं, आप मूल रूप से 'सामान्य' एप्लिकेशन चला रहे हैं, जैसे आप 1 धागा शुरू करते हैं और जारी रखने तक प्रतीक्षा करते हैं।

12

आप CTRL + सी संकेत में शामिल होते समय प्राप्त करने के लिए मुख्य थ्रेड करना चाहते हैं, यह join() कॉल करने के लिए समय समाप्ति जोड़कर किया जा सकता है।

निम्नलिखित काम कर रहा है (यदि आप मुख्य वास्तव में समाप्त करना चाहते हैं daemon=True जोड़ने के लिए भूल नहीं है):

thread1.start() 
while True: 
    thread1.join(600) 
    if not thread1.isAlive(): 
     break