2010-08-12 20 views
10

Obviamente, he entendido mal algo fundamental sobre el atributo daemon de un objeto Thread Thread.Comprender los hilos del daemon de Python

considerar lo siguiente:

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" 

De la documentación de Python:

enteras se sale del programa Python cuando sin hilos no demonio se dejan vivos.

Así que si corro con TestThread como daemon, esperaría que salga una vez que el hilo principal se haya completado. Pero esto no sucede:

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

¿Qué no consigo?


Según lo adivinado por Justin y Brent, corría con Python 2.5. Acabo de llegar a casa y probé en mi propia máquina con 2.7, y todo funciona bien. Gracias por tu ayuda!

Respuesta

12

Su comprensión sobre qué daemon hilos debería hacer es correcto.

En cuanto a por qué esto no está sucediendo, supongo que está utilizando una versión anterior de Python. Los documentos Python 2.5.4 incluyen una función setDaemon(daemonic), así como isDaemon() para verificar si un hilo es un hilo daemon. Los documentos 2.6 los reemplazan con un indicador directamente modificable daemon.

Referencias:

http://docs.python.org/release/2.5.4/ (sin daemon miembro mencionado)

http://docs.python.org/release/2.6/library/threading.html (incluye daemon miembro)

+0

No me di cuenta de que 'isDaemon' y' setDaemon' estaban bastante obsoletos en 2.7. Bueno saber. –

6

Sólo por curiosidad, ¿qué sistema operativo y la versión de Python que se ejecuta?

Estoy en Python 2.6.2 en Mac OS X 10.5.8.

Cuando ejecuto el script, esto es lo que me sale:

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) 

que parece exactamente lo que se espera.

Y aquí es el comportamiento correspondiente no-daemon (hasta Maté al proceso):

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 

parece bastante normal para mí.