डेमन थ्रेड्स स्पष्टीकरण


237

में अजगर प्रलेखन यह कहते हैं:

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

क्या किसी का स्पष्ट अर्थ है कि इसका क्या अर्थ है या एक व्यावहारिक उदाहरण है जहां आप थ्रेड्स सेट करेंगे daemonic?

मेरे लिए इसे स्पष्ट करें: तो केवल वही स्थिति है जो आप धागे के रूप में सेट नहीं करेंगे daemonic, जब आप चाहते हैं कि वे मुख्य धागे से बाहर निकलने के बाद भी जारी रखें?

जवाबों:


447

कुछ सूत्र पृष्ठभूमि कार्य करते हैं, जैसे कि रखवाले पैकेट भेजना, या आवधिक कचरा संग्रह करना, या जो भी हो। ये केवल तब उपयोगी होते हैं जब मुख्य कार्यक्रम चल रहा हो, और एक-दूसरे, गैर-डेमॉन, धागे बाहर निकल जाने के बाद उन्हें मारना ठीक है।

डेमन थ्रेड्स के बिना, आपको अपने कार्यक्रम को पूरी तरह से छोड़ने से पहले, उन्हें ट्रैक करना होगा और उन्हें बाहर निकलने के लिए कहना होगा। उन्हें डेमन थ्रेड्स के रूप में सेट करके, आप उन्हें चला सकते हैं और उनके बारे में भूल सकते हैं, और जब आपका प्रोग्राम क्विट करता है, तो किसी भी डेमन थ्रेड्स स्वचालित रूप से मारे जाते हैं।


1
इसलिए यदि मेरे पास एक बच्चा धागा है जो एक फाइल राइटिंग ऑपरेशन कर रहा है जो कि गैर-बधिरों के लिए सेट है, तो क्या इसका मतलब है कि मुझे इसे स्पष्ट रूप से बाहर निकालना होगा?
सियासतो पाइक्ज

8
@ लेखन समाप्त होने के बाद आपका लेखक धागा क्या करता है? क्या यह अभी वापस लौटा? यदि हां, तो यह पर्याप्त है। डेमन थ्रेड आमतौर पर लूप में चलने वाली चीजों के लिए होते हैं और अपने आप बाहर नहीं निकलते हैं।
क्रिस जस्टर-यंग

यह कुछ भी नहीं करता है, न ही रिटर्न करता है, फाइल राइट ऑपरेशन करने का इसका एकमात्र उद्देश्य है
Ciasto piekarz

2
@ अगर यह थ्रेड फ़ंक्शन के निचले भाग से गिरता है, तो यह अंतर्निहित रूप से वापस आ जाता है।
क्रिस जस्टर-यंग

यह Noneउस स्थिति में लौटता है, लेकिन इससे कोई फर्क नहीं पड़ता, वापसी मूल्य का उपयोग नहीं किया जाता है।
क्रिस जस्टर-यंग

30

मान लें कि आप किसी प्रकार का डैशबोर्ड विजेट बना रहे हैं। इसके भाग के रूप में, आप चाहते हैं कि यह आपके ईमेल बॉक्स में बिना पढ़े संदेश की गिनती प्रदर्शित करे। तो आप एक छोटा सा धागा बनाते हैं:

  1. मेल सर्वर से कनेक्ट करें और पूछें कि आपके पास कितने अपठित संदेश हैं।
  2. जीयूआई को अद्यतन गणना के साथ संकेत दें।
  3. थोड़ी देर के लिए सो जाओ।

जब आपका विजेट शुरू होता है, तो यह इस धागे का निर्माण करेगा, इसे एक डेमॉन नामित करेगा, और इसे शुरू करेगा। क्योंकि यह एक डेमॉन है, आपको इसके बारे में सोचने की ज़रूरत नहीं है; जब आपका विजेट बाहर निकलता है, तो थ्रेड अपने आप बंद हो जाएगा।


18

अन्य पोस्टरों ने उन स्थितियों के लिए कुछ उदाहरण दिए हैं जिनमें आप डेमन थ्रेड्स का उपयोग करेंगे। मेरी सिफारिश, हालांकि, उनका उपयोग कभी नहीं करना है।

ऐसा नहीं है क्योंकि वे उपयोगी नहीं हैं, लेकिन क्योंकि कुछ बुरे दुष्प्रभाव हैं जिन्हें आप अनुभव कर सकते हैं यदि आप उनका उपयोग करते हैं। पायथन रनटाइम मुख्य थ्रेड में चीजों को तोड़ना शुरू करने के बाद डेमन थ्रेड्स अभी भी निष्पादित कर सकते हैं, जिससे कुछ विचित्र अपवाद हो सकते हैं।

अधिक जानकारी यहाँ:

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-February/343697.html

कड़ाई से बोलते हुए आपको कभी भी उनकी आवश्यकता नहीं है, यह सिर्फ कुछ मामलों में कार्यान्वयन को आसान बनाता है।


फिर भी अजगर 3 के साथ यह मुद्दा? प्रलेखन में इन "विचित्र अपवादों" के बारे में कोई स्पष्ट जानकारी नहीं है।
खेरौद

5
जो के ब्लॉग पोस्ट से: "जून 2015 को अपडेट करें: यह पायथन बग 1856 है । यह पायथन 3.2.1 और 3.3 में तय किया गया था, लेकिन फिक्स को कभी भी 2.x पर वापस नहीं भेजा गया। (2.7 शाखा में बैकपोर्ट के प्रयास ने एक और बग पैदा कर दिया। और इसे छोड़ दिया गया था।) पायथन> = 3.2.1 में डेमन थ्रेड्स ठीक हो सकते हैं, लेकिन निश्चित रूप से पुराने संस्करणों में नहीं हैं। "
क्लैक

मैं यहां अपना अनुभव साझा करना चाहता हूं: मैंने कई बार थ्रेड के रूप में कार्य किया था। इसके अंदर, मेरे पास पायथन का एक उदाहरण था loggingऔर मुझे उम्मीद थी कि, थ्रेड को खत्म करने के बाद, सभी ऑब्जेक्ट्स (प्रत्येक थ्रेड / फ़ंक्शन के लिए फ़ाइल डिस्क्रिप्टर्स) नष्ट हो जाएंगे। अपने कार्यक्रम के अंत में, मैंने कई आउटपुट देखे जैसे IOError: [Errno 24] Too many open files:। इसके साथ lsof -p pid_of_program, मुझे पता चला कि एफडी खुले थे, यहां तक ​​कि थ्रेड / फंक्शंस ने भी अपनी नौकरियां खत्म कर दीं। वैकल्पिक हल? फ़ंक्शन के अंत में लॉग हैंडलर को निकालना। इसलिए daemonicथ्रेड्स, अविश्वसनीय हैं ...
ivanleoncz

17

इसके बारे में सोचने का एक सरल तरीका, शायद: जब मुख्य रिटर्न, आपकी प्रक्रिया से बाहर नहीं निकलेंगे यदि गैर-डेमॉन थ्रेड अभी भी चल रहे हैं।

थोड़ी सलाह: थ्रेड्स और सिंक्रोनाइज़ेशन शामिल होने पर क्लीन शटडाउन गलत होना आसान है - यदि आप इससे बच सकते हैं, तो ऐसा करें। जब भी संभव हो डेमॉन थ्रेड्स का उपयोग करें।


13

क्रिस ने पहले ही समझाया कि डेमन थ्रेड्स क्या हैं, तो आइए व्यावहारिक उपयोग के बारे में बात करते हैं। कई थ्रेड पूल कार्यान्वयन कार्य श्रमिकों के लिए डेमन थ्रेड का उपयोग करते हैं। श्रमिक वे सूत्र हैं जो कार्य कतार से कार्यों को निष्पादित करते हैं।

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


4
उस से सावधान रहें! यदि कोई प्रोग्राम एक महत्वपूर्ण कार्य (उदाहरण के लिए, कुछ फ़ाइल "बैकग्राउंड में अपडेट करें") को एक डेमन टास्क कतार में जमा करता है, तो एक जोखिम है कि प्रोग्राम उस कार्य को अपडेट करने से पहले या उस फ़ाइल को अपडेट करने के बीच में समाप्त कर सकता है।
सोलोमन स्लो

10

क्रिस का हवाला देते हुए: "... जब आपका कार्यक्रम समाप्त होता है, तो किसी भी डेमन थ्रेड को स्वचालित रूप से मार दिया जाता है।" मुझे लगता है कि यह रकम है। जब आप उनका उपयोग करते हैं तो आपको सावधान रहना चाहिए क्योंकि वे मुख्य कार्यक्रम के पूरा होने पर अचानक समाप्त कर देते हैं।


4

जब आपका दूसरा धागा गैर-डेमन होता है, तो आपके आवेदन का प्राथमिक मुख्य धागा नहीं निकल सकता है क्योंकि इसके निकास मानदंड गैर-डेमन थ्रेड (एस) के निकास से बंधा हुआ है। पायथन में थ्रेड्स को जबरन नहीं मारा जा सकता है, इसलिए आपके ऐप को गैर-डेमॉन थ्रेड (एस) से बाहर निकलने के लिए वास्तव में इंतजार करना होगा। यदि यह व्यवहार वह नहीं है जो आप चाहते हैं, तो अपने दूसरे धागे को डेमन के रूप में सेट करें ताकि यह आपके आवेदन को बाहर निकलने से रोक न सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.