अगर मैं एक अनंत लूप में एक धागा है, तो इसे समाप्त करने के लिए जब मुख्य कार्यक्रम समाप्त होता है (उदाहरण के लिए, मैं जब प्रेस एक तरीका है Ctrl+ C)?
जवाबों:
इस प्रश्न की जाँच करें। सही उत्तर में थ्रेड को सही तरीके से समाप्त करने के तरीके के बारे में बहुत व्याख्या है: क्या पायथन में थ्रेड को मारने का कोई तरीका है?
कीबोर्ड इंटरप्ट सिग्नल (ctrl + c) पर थ्रेड स्टॉप बनाने के लिए आप बाहर निकलने से पहले "KeyboardInterrupt" और क्लीनअप अपवाद को पकड़ सकते हैं। इस कदर:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
इस तरह से आप नियंत्रित कर सकते हैं कि जब भी कार्यक्रम अचानक समाप्त हो जाए तो क्या करें।
आप अंतर्निहित सिग्नल मॉड्यूल का उपयोग भी कर सकते हैं जो आपको सिग्नल हैंडलर सेटअप करने देता है (अपने विशिष्ट मामले में संकेत): http://docs.python.org/library/signal.html
cleanup_stop_thread()
एक वैश्विक कार्य है जिसका मैं उपयोग कर सकता हूं? या क्या मुझे इसे लागू करने की आवश्यकता है?
यदि आप अपने कार्यकर्ता धागे को डेमॉन थ्रेड बनाते हैं, तो वे मर जाएंगे जब आपके सभी गैर-डायमन थ्रेड्स (जैसे मुख्य धागा) बाहर निकल जाते हैं।
http://docs.python.org/library/threading.html#threading.Thread.daemon
isDaemon()
गलत है, इसे सही द्वारा सेट करें setDaemon(True)
।
isDaemon()
और setDaemon()
वर्ष getters / setters हैं (ऊपर लिंक दस्तावेज़ के अनुसार), बस का उपयोग daemon=True
मेंthreading.Thread()
उप-धागे को डेमन-थ्रेड के रूप में सक्षम करने का प्रयास करें।
सिफारिश की:
from threading import Thread
t = Thread(target=<your-method>)
t.daemon = True # This thread dies when main thread (only non-daemon thread) exits.
t.start()
पंक्ति में:
t = Thread(target=<your-method>, daemon=True).start()
पुराना API:
t.setDaemon(True)
t.start()
अपने मुख्य थ्रेड समाप्त ( "यानी जब मैं प्रेस जब Ctrl+ C"), अन्य थ्रेड भी ऊपर दिए गए निर्देशों के हाथों मारे गए हो जाएगा।
"समाप्ति" फ़ंक्शन को पंजीकृत करने के लिए पायथन की मानक लाइब्रेरी के एटैक्सिट मॉड्यूल का उपयोग करें जो मुख्य धागे के किसी भी यथोचित "साफ" समाप्ति पर (मुख्य थ्रेड पर) कॉल करते हैं, जैसे कि बिना किसी अपवाद के अपवाद KeyboardInterrupt
। इस तरह के टर्मिनेशन फंक्शन (मुख्य थ्रेड में अनिवार्य रूप से!) stop
आपको किसी भी फ़ंक्शन को कॉल करने की आवश्यकता होती है; साथ में एक धागा सेट करने की संभावना के साथ daemon
, जो आपको सिस्टम की कार्यक्षमता को ठीक से डिजाइन करने के लिए उपकरण देता है जो आपको चाहिए।
atexit.register()
पायथन मॉड्यूल्स में पोस्ट-पॉन्ड कॉल के कारण अजीब चीजें हो सकती हैं , जिससे आपकी समाप्ति प्रक्रिया समाप्त हो सकती है multiprocessing
। मैं इस समस्या से जूझ रहा हूं Queue
और daemon
थ्रेड से निपटने में : "ईओएफ त्रुटि" प्रोग्राम एग्जिट पर मल्टीप्रोसेसिंग क्यू और थ्रेड का उपयोग करते हुए ।
atexit
गैर-डेमन थ्रेड जीवित होने पर हैंडलर नहीं कहलाते हैं और मुख्य धागा बाहर निकलता है। देखें जब atexit का उपयोग कर धागे समाप्त करने के लिए स्क्रिप्ट से बाहर निकलें पर अटक ।
यदि आप किसी थ्रेड को जैसे - myThread = Thread(target = function)
- और तब करते हैं myThread.start(); myThread.join()
। जब CTRL-C शुरू किया जाता है, तो मुख्य धागा बाहर नहीं निकलता है क्योंकि यह उस अवरुद्ध myThread.join()
कॉल पर प्रतीक्षा कर रहा है । इसे ठीक करने के लिए, बस .join () कॉल पर टाइमआउट में डालें। आपकी इच्छानुसार समय समाप्त हो सकता है। यदि आप इसे अनिश्चित काल तक इंतजार करना चाहते हैं, तो बस 99999 की तरह, वास्तव में लंबे समय के लिए रखा गया है myThread.daemon = True
। मुख्य थ्रेड (गैर-डेमन) से बाहर निकलने पर सभी थ्रेड्स बाहर निकलने के लिए ऐसा करना भी अच्छा अभ्यास है।
myThread.daemon = True
इस समस्या का एक अद्भुत समाधान है।
.daemon=True
एक ठोस समाधान नहीं है। एक स्पष्टीकरण के लिए इस धागे की जाँच करें: stackoverflow.com/a/20598791/5562492
डेमन थ्रेड्स को असामयिक रूप से मार दिया जाता है, इसलिए किसी भी अंतिम निर्देशों को निष्पादित नहीं किया जाता है। जाँच करने के लिए एक संभावित समाधान अनंत लूप के बजाय मुख्य धागा जीवित है।
पायथन 3 के लिए जैसे:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()