अजगर धागे सभी कार्यान्वयन मुझे पता है (सी अजगर, PyPy और Jython) में ओएस धागे का उपयोग करके लागू। प्रत्येक पायथन धागे के लिए, एक अंतर्निहित ओएस धागा है।
कुछ ऑपरेटिंग सिस्टम (लिनक्स उनमें से एक है) सभी चल रही प्रक्रियाओं की सूची में एक ही निष्पादन योग्य द्वारा लॉन्च किए गए सभी अलग-अलग धागे दिखाते हैं। यह ओएस का कार्यान्वयन विवरण है, पायथन के नहीं। कुछ अन्य ऑपरेटिंग सिस्टम पर, आप सभी प्रक्रियाओं को सूचीबद्ध करते समय उन धागे को नहीं देख सकते हैं।
प्रक्रिया जब अंतिम गैर-डेमॉन धागा खत्म समाप्त कर देगा। उस बिंदु पर, सभी डेमॉन धागे समाप्त हो जाएंगे। तो, ये धागे आपकी प्रक्रिया का हिस्सा हैं, लेकिन इसे समाप्त करने से नहीं रोक रहे हैं (जबकि एक नियमित थ्रेड इसे रोक देगा)। यह शुद्ध पायथन में लागू किया गया है। एक प्रक्रिया समाप्त होती है जब सिस्टम _exit
फ़ंक्शन को कॉल किया जाता है (यह सभी धागे को मार देगा), और जब मुख्य धागा समाप्त हो जाता है (या sys.exit
कहा जाता है), पाइथन दुभाषिया जांचता है कि कोई अन्य गैर-डिमन थ्रेड चल रहा है या नहीं। यदि कोई नहीं है, तो यह _exit
पर कॉल करता है, अन्यथा यह गैर-डिमन थ्रेड समाप्त होने की प्रतीक्षा करता है।
डेमॉन धागा झंडा शुद्ध पायथन में threading
मॉड्यूल द्वारा कार्यान्वित किया जाता है। जब मॉड्यूल लोड होता है, तो Thread
ऑब्जेक्ट मुख्य थ्रेड का प्रतिनिधित्व करने के लिए बनाया गया है, और यह _exitfunc
विधि atexit
हुक के रूप में पंजीकृत है।
इस समारोह का कोड है:
class _MainThread(Thread):
def _exitfunc(self):
self._Thread__stop()
t = _pickSomeNonDaemonThread()
if t:
if __debug__:
self._note("%s: waiting for other threads", self)
while t:
t.join()
t = _pickSomeNonDaemonThread()
if __debug__:
self._note("%s: exiting", self)
self._Thread__delete()
इस समारोह अजगर दुभाषिया द्वारा कॉल किया जाएगा sys.exit
कहा जाता है, या मुख्य थ्रेड समाप्त हो जाता है जब। जब फ़ंक्शन वापस आता है, तो दुभाषिया सिस्टम _exit
फ़ंक्शन को कॉल करेगा। और फ़ंक्शन समाप्त हो जाएगा, जब केवल डेमॉन थ्रेड चल रहे हों (यदि कोई हो)।
जब _exit
फ़ंक्शन कहा जाता है, तो ओएस सभी प्रक्रिया धागे को समाप्त कर देगा, और फिर प्रक्रिया को समाप्त कर देगा। पाइथन रनटाइम _exit
फ़ंक्शन को तब तक कॉल नहीं करेगा जब तक कि सभी गैर-डिमन थ्रेड किए जाते हैं।
सभी धागे प्रक्रिया का हिस्सा हैं।
मेरे व्याख्या/समझ थी: मुख्य थ्रेड समाप्त हो जाता है जब सभी गैर डेमॉन धागे समाप्त कर दिया जाता।
तो पाइथन डेमन थ्रेड पाइथन प्रोग्राम का हिस्सा नहीं हैं अगर "पूरे पायथन प्रोग्राम निकलता है जब केवल डेमॉन थ्रेड छोड़े जाते हैं"?
आपकी समझ गलत है। ओएस के लिए, एक प्रक्रिया कई धागे से बना है, जिनमें से सभी बराबर हैं (ओएस के लिए मुख्य धागे के बारे में कुछ भी खास नहीं है, सिवाय इसके कि सी रनटाइम पर main
फ़ंक्शन के अंत में एक कॉल जोड़ें)। और ओएस डिमन धागे के बारे में नहीं जानता है। यह पूरी तरह से एक पायथन अवधारणा है।
पाइथन दुभाषिया पाइथन थ्रेड को लागू करने के लिए देशी धागे का उपयोग करता है, लेकिन इसे बनाए गए धागे की सूची याद रखना है। और इसके atexit
हुक का उपयोग करके, यह सुनिश्चित करता है कि _exit
फ़ंक्शन केवल ओएस पर लौटाता है जब अंतिम गैर-डिमन थ्रेड समाप्त हो जाता है। "पूरे पायथन प्रोग्राम" का उपयोग करते समय, दस्तावेज़ीकरण पूरी प्रक्रिया को संदर्भित करता है।
निम्नलिखित कार्यक्रम में मदद कर सकते डेमॉन धागा और नियमित रूप से धागा के बीच अंतर समझना:
import sys
import time
import threading
class WorkerThread(threading.Thread):
def run(self):
while True:
print 'Working hard'
time.sleep(0.5)
def main(args):
use_daemon = False
for arg in args:
if arg == '--use_daemon':
use_daemon = True
worker = WorkerThread()
worker.setDaemon(use_daemon)
worker.start()
time.sleep(1)
sys.exit(0)
if __name__ == '__main__':
main(sys.argv[1:])
आप '--use_daemon' के साथ इस कार्यक्रम पर अमल करते हैं, तो आप देखेंगे कि कार्यक्रम केवल होगा Working hard
लाइनों की एक छोटी संख्या मुद्रित करें। इस ध्वज के बिना, मुख्य थ्रेड खत्म होने पर भी प्रोग्राम समाप्त नहीं होगा, और प्रोग्राम Working hard
लाइनों को तब तक मुद्रित करेगा जब तक कि यह मारे नहीं जाता है।
आपका मतलब है 'थ्रेडिंग। थ्रेड' सही? –
हाँ, मैं करता हूं। मानक पायथन में अन्य धागे हैं? – warvariuc
हां, 'थ्रेड 'मॉड्यूल देशी धागे को एक और इंटरफ़ेस प्रदान करता है (लेकिन हे उसी मूल कार्यान्वयन का उपयोग करता है)। –