2012-07-11 36 views
6

Comienzo un hilo con el siguiente código.Cómo puedo matar un hilo en python

t = thread.start_new_thread(myfunction) 

¿Cómo puedo matar al hilo t de otro hilo. Básicamente hablando en términos de código, quiero ser capaz de hacer algo como esto.

t.kill() 

Tenga en cuenta que estoy usando Python 2.4.

+0

¿Puedo preguntar por qué está utilizando el módulo * thread * de bajo nivel en lugar de la biblioteca * threading * de alto nivel? –

Respuesta

10

Si su hilo está ocupado ejecutando código Python, tiene un problema mayor que la imposibilidad de matarlo. El GIL evitará que cualquier otro hilo ejecute las instrucciones que usaría para matar. (Después de investigar un poco, me enteré de que el intérprete libera periódicamente el GIL, por lo que el enunciado anterior es falso. Sin embargo, el comentario restante)

Su cadena debe escribirse de forma cooperativa. Es decir, debe verificar periódicamente con un objeto de señalización como un semáforo, que el hilo principal puede usar para ordenar al hilo del trabajador que salga voluntariamente.

while not sema.acquire(False): 
    # Do a small portion of work… 

o:

for item in work: 
    # Keep working… 
     # Somewhere deep in the bowels… 
     if sema.acquire(False): 
      thread.exit() 
+0

¿Cómo obtener ese 'sema'? –

+0

https://docs.python.org/2/library/threading.html#semaphore-objects –

+1

mi hilo está esperando en raw_input() ....: S – ntg

7

No se puede eliminar un hilo de otro hilo. Debes indicar al otro hilo que debería terminar. Y por "señal" no me refiero a usar la función signal, quiero decir que debe organizar alguna comunicación entre los hilos.

+2

El punto es que el hilo que quiero matar puede estar ocupado en una función, y quiero terminarlo abruptamente si se ha vuelto demasiado ocupado (ahorcado, estancado). – pythonic

+1

¿No sería mejor hacer el hilo para que no se cuelgue/se estanque? Normalmente, usarías algún tipo de mutex/sempahore/bandera para señalar el hilo y hacer que caiga de su ciclo. – DipSwitch

+1

Utilice un tiempo de espera para el subproceso y un manejador de señal que capte esa interrupción de tiempo de espera. – bos

14

En Python, usted simplemente no puede matar a un hilo.

Si usted realmente no necesita tener un hilo (!), Lo que puede hacer, en lugar de utilizar el paquete enhebrar (http://docs.python.org/2/library/threading.html), es usar el paquete multiprocesamiento (http://docs.python.org/2/library/multiprocessing.html). Aquí, para matar un proceso, sólo tiene que llamar al método:

yourProcess.terminate() # kill the process! 

Python matará a su proceso (en Unix a través de la señal SIGTERM, mientras que en Windows a través de la llamada TerminateProcess()). ¡Preste atención para usarlo mientras usa una cola o un tubo! (Que podría corromper los datos en la cola de espera/Pipe)

Tenga en cuenta que la multiprocessing.Event y el trabajo multiprocessing.Semaphore exactamente de la misma manera de la threading.Event y la threading.Semaphore respectivamente. De hecho, los primeros son clones de los últimos.

Si REALMENTE necesita utilizar un subproceso, no hay manera de matar sus subprocesos directamente. Sin embargo, lo que puede hacer es usar un "hilo daemon". De hecho, en Python, un hilo puede ser marcado como daemon :

yourThread.daemon = True # set the Thread as a "daemon thread" 

El programa principal se cerrará cuando no hay hilos no demonio se dejan vivos. En otras palabras, cuando su hilo principal (que es, por supuesto, un hilo que no sea daemon) terminará sus operaciones, el programa se cerrará incluso si todavía hay algunos hilos daemon en funcionamiento.

en cuenta que es necesario fijar un hilo como daemon antes del inicio () método se llama!

Por supuesto que puede, y debe, utilizar demonio incluso con multiprocesamiento. Aquí, cuando el proceso principal finaliza, intenta terminar todos sus procesos secundarios demoníacos.

Por último, por favor, tenga en cuenta que sys.exit() y os.kill() no son opciones.

+0

Para aclarar subprocesos vs multiproceso hay http://stackoverflow.com/questions/18114285/python-what-are-the-differences-between-the-threading-and-multiprocessing-modul –

+0

Me gusta esta respuesta .... Es la vieja verdad sobre la naturaleza de los hilos ... – repzero

Cuestiones relacionadas