2010-08-12 16 views
10

मैंने स्पष्ट रूप से पाइथन थ्रेड ऑब्जेक्ट के डेमन विशेषता के बारे में कुछ मौलिक समझा है।पाइथन डेमन थ्रेड्स को समझना

daemonic.py 

import sys, threading, time 

class TestThread(threading.Thread): 
    def __init__(self, daemon): 
     threading.Thread.__init__(self) 
     self.daemon = daemon 

    def run(self): 
     x = 0 
     while 1: 
      if self.daemon: 
       print "Daemon :: %s" % x 
      else: 
       print "Non-Daemon :: %s" % x 
      x += 1 
      time.sleep(1) 

if __name__ == "__main__": 
    print "__main__ start" 
    if sys.argv[1] == "daemonic": 
     thread = TestThread(True) 
    else: 
     thread = TestThread(False) 
    thread.start() 
    time.sleep(5) 
    print "__main__ stop" 

अजगर डॉक्स से::

निम्नलिखित पर विचार करें

पूरे अजगर कार्यक्रम बाहर निकलता है जब कोई जिंदा गैर डेमॉन धागे छोड़ दिया जाता है।

तो अगर मैं एक डेमॉन के रूप में TestThread साथ चलाने के लिए, मैं इसे बाहर निकलने के लिए एक बार मुख्य थ्रेड पूरा कर लिया है उम्मीद करेंगे। लेकिन ऐसा नहीं होता है:

> python daemonic.py daemonic 
__main__ start 
Daemon :: 0 
Daemon :: 1 
Daemon :: 2 
Daemon :: 3 
Daemon :: 4 
__main__ stop 
Daemon :: 5 
Daemon :: 6 
^C 

मुझे क्या नहीं मिलता?


जस्टिन और ब्रेंट द्वारा अनुमानित अनुसार, मैं पायथन 2.5 के साथ चल रहा था। अभी घर आ गया है और अपनी मशीन पर 2.7 चल रहा है, और सबकुछ ठीक काम करता है। आपकी मदद के लिए धन्यवाद!

उत्तर

12

डेमॉन थ्रेड क्या करना चाहिए इसके बारे में आपकी समझ सही है।

यह क्यों नहीं हो रहा है, मुझे लगता है कि आप पाइथन के पुराने संस्करण का उपयोग कर रहे हैं। पाइथन 2.5.4 डॉक्स में setDaemon(daemonic) फ़ंक्शन, साथ ही isDaemon() शामिल है यह जांचने के लिए कि कोई थ्रेड डिमन थ्रेड है या नहीं। 2.6 दस्तावेज़ इन्हें सीधे संशोधित daemon ध्वज के साथ प्रतिस्थापित करते हैं।

संदर्भ:

http://docs.python.org/release/2.5.4/ (कोई daemon सदस्य उल्लेख)

http://docs.python.org/release/2.6/library/threading.html (शामिल daemon सदस्य)

+0

पता नहीं था कि 'isDaemon' और' setDaemon' 2.7 में बहुत अधिक बहिष्कृत थे। जानकार अच्छा लगा। –

6
बस जिज्ञासा से बाहर

, क्या ओएस और अजगर के किस संस्करण चल रहे हैं?

मै मैक ओएस एक्स 10.5.8 पर पायथन 2.6.2 पर हूं।

जब मैं अपनी स्क्रिप्ट चलाने, यहाँ मैं क्या मिलेगा:

bnash-macbook:Desktop bnash$ python daemon.py daemonic 
__main__ start 
Daemon :: 0 
Daemon :: 1 
Daemon :: 2 
Daemon :: 3 
Daemon :: 4 
__main__ stop 
Exception in thread Thread-1 (most likely raised during interpreter shutdown) 

कौन सा है जैसे आप वास्तव में क्या उम्मीद थी लगता है।

bnash-macbook:Desktop bnash$ python daemon.py asdf  
__main__ start 
Non-Daemon :: 0 
Non-Daemon :: 1 
Non-Daemon :: 2 
Non-Daemon :: 3 
Non-Daemon :: 4 
__main__ stop 
Non-Daemon :: 5 
Non-Daemon :: 6 
Non-Daemon :: 7 
Non-Daemon :: 8 
Terminated 

मेरे लिए काफी सामान्य लगता है:

और यहाँ इसी गैर डेमॉन व्यवहार (जब तक मैं इस प्रक्रिया को मार डाला) है।

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