2008-10-10 12 views
161

Python documentation यह कहते हैं:Daemon धागे स्पष्टीकरण

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

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


मेरे लिए स्पष्ट करने के लिए:

तो केवल समय आप होगा नहीं है राक्षसी के रूप में सेट धागे अगर आप उन्हें मुख्य थ्रेड बाहर निकलता है के बाद निरंतर चलाने के लिए चाहते थे?

उत्तर

319

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

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

+11

यह वास्तव में एक भयानक स्पष्टीकरण है, क्योंकि आप उल्लेख करते हैं कि वास्तविक दुनिया के कर्तव्यों में से कोई एक डिमन थ्रेड के रूप में असाइन कर सकता है। धन्यवाद! – dotancohen

+0

तो अगर मेरे पास एक बच्चा धागा है जो फ़ाइल लिखने का ऑपरेशन कर रहा है जो गैर-डेमॉन पर सेट है, तो क्या इसका मतलब है कि मुझे इसे स्पष्ट रूप से बाहर निकलना है? –

+3

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

21

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

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

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

13

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

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

9

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

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

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

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

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

सच पूछिये तो आप उन्हें जरूरत कभी नहीं, यह सिर्फ कार्यान्वयन कुछ मामलों में आसान बनाता है।

+0

अभी भी इस समस्या को अजगर 3 के साथ? दस्तावेज़ीकरण में इन "विचित्र अपवादों" के बारे में कोई स्पष्ट जानकारी नहीं है। – iwalktheline

+0

वे लिंक पहुंच योग्य नहीं हैं। – Tshepang

+0

पहला लिंक मेरा व्यक्तिगत ब्लॉग है, यह अस्थायी रूप से डाउन हो रहा है क्योंकि होस्टिंग प्रदाता डाउन है। उम्मीद है कि यह जल्द ही वापस आ जाएगा। मुझे दूसरे लिंक में संदर्भित पोस्ट ढूंढने में कठिन समय हो रहा है। –

4

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

8

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

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

+0

इसके साथ सावधान रहें! यदि कोई प्रोग्राम _important_ कार्य सबमिट करता है (उदा।, किसी फ़ाइल को "पृष्ठभूमि में" अपडेट करें) को एक डेमॉन कार्य कतार में अपडेट करें, फिर उस जोखिम को अद्यतन करने से पहले प्रोग्राम को कार्य करने से पहले कार्य को समाप्त कर दिया जा सकता है, या इससे भी बदतर। –

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