2010-10-04 19 views
11

थ्रेडिंग मॉड्यूल और थ्रेड() वर्ग का उपयोग करते समय, SIGINT (कंसोल में Ctrl + C) को कैच नहीं किया जा सका।मैं थिगिंग पायथन प्रोग्राम में सिगिनट कैसे पकड़ सकता हूं?

मैं और क्या कर सकता हूं?

सरल परीक्षण कार्यक्रम:

#!/usr/bin/env python 

import threading 

def test(suffix): 
    while True: 
     print "test", suffix 

def main(): 
    for i in (1, 2, 3, 4, 5): 
     threading.Thread(target=test, args=(i,)).start() 

if __name__ == "__main__": 
    main() 

मार Ctrl-C का प्रयास करें - कुछ नहीं होता।

उत्तर

8

धागे और सिग्नल मिश्रण नहीं करते हैं। पायथन में यह बाहर की तुलना में मामला भी अधिक है: सिग्नल केवल एक थ्रेड (मुख्य धागा) तक पहुंचाया जाता है; अन्य धागे संदेश नहीं मिलेगा। मुख्य धागे के अलावा धागे को बाधित करने के लिए आप कुछ भी नहीं कर सकते हैं। वे आपके नियंत्रण से बाहर हैं।

एकमात्र चीज जो आप यहां कर सकते हैं वह है queue मॉड्यूल का उपयोग करके मुख्य धागे और जो भी धागे आप शुरू करते हैं, के बीच संचार चैनल पेश करते हैं। फिर आप धागे को एक संदेश भेज सकते हैं और संदेश को देखते समय इसे समाप्त कर सकते हैं (या जो कुछ भी आप चाहते हैं) कर सकते हैं।

वैकल्पिक रूप से, और यह अक्सर एक बहुत अच्छा विकल्प है, धागे का उपयोग नहीं करना है। इसके बजाय इसका उपयोग करने के लिए आप जो कुछ हासिल करने की कोशिश कर रहे हैं उस पर निर्भर करता है।

+3

मुख्य धागा लपेट या तो SIGINT प्राप्त नहीं होता। अन्यथा मैं इसे पकड़ सकता हूं और sys.exit (0) को कॉल कर सकता हूं। –

+0

लगता है कि मैं गलत हूं। मुख्य धागा SIGINT प्राप्त करते हैं। धन्यवाद! –

+0

लेकिन मुझे समझ में नहीं आता क्यों sys.exit (0) सिग्नल हैंडलर में काम नहीं करता है। –

-1

मूल रूप से आप जांच सकते हैं कि क्या माता-पिता ने काम के दौरान एक कतार पढ़कर एक सिग्नल जारी किया है या नहीं। माता-पिता एक SIGINT प्राप्त करता है तो यह (इस मामले में कुछ भी में) कतार भर में एक संकेत जारी करता है और बच्चों को अपने काम और बाहर निकलने ...

def fun(arg1, thread_no, queue): 
    while True: 
    WpORK... 
    if queue.empty() is False or errors == 0: 
    print('thread ', thread_no, ' exiting...') 
    with open('output_%i' % thread_no, 'w') as f: 
     for line in lines: f.write(line) 
    exit() 

threads = [] 
for i, item in enumerate(items): 
threads.append(dict()) 
q = queue.Queue() 
threads[i]['queue'] = q 
threads[i]['thread'] = threading.Thread(target=fun, args=(arg1, i, q)) 
threads[i]['thread'].start() 
try: 
time.sleep(10000) 
except: 
for thread in threads: 
    thread['queue'].put('TERMINATING') 
+0

कृपया यह बताएं कि यह कोड क्यों काम करता है। कोड डंपिंग आमतौर पर स्टैक ओवरफ्लो पर निराश होती है। – rayryeng

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