¿Qué hace realmente sys.exit con múltiples hilos?

Estaba realmente confundido por sys.exit () en python. En la documentación de Python , dice “Salir de Python”; ¿ sys.exit() significa que cuando se llama a sys.exit() en un progtwig de Python, el proceso se cerrará? Si es así, el siguiente código muestra un resultado diferente:

 import sys import time import threading def threadrun(): while(True): time.sleep(1) if __name__=="__main__": t=threading.Thread(target=threadrun) t.start() sys.exit() 

Al lanzar este progtwig en Linux, el resultado no fue el esperado, como dice la documentación de Python, pero aún se ejecuta en el sistema, así que, ¿qué hace realmente sys.exit() ?

Según la documentación, sys.exit() genera SystemExit :

Salga del intérprete elevando SystemExit (estado).

Si SystemExit alcanza el controlador de excepciones predeterminado , llama a handle_system_exit() , que más o menos empuja a Py_Finalize() , que a su vez llama a wait_for_thread_shutdown() en Python 2, por lo que sys.exit() es el mismo que el normal la parte inferior del módulo principal en espera de que terminen todos los subprocesos que no sean daemon.

(Parafraseando lo que está en la documentación de Python 2 para Thread Objects )

Normalmente, un progtwig de Python se cierra solo cuando no hay nada más que hilos de daemon ign (ignorándose a sí mismos) dejados en ejecución. El objeto “hilo principal” que corresponde al hilo de control inicial en el progtwig no es un hilo demonio. Los threading.Thread crean utilizando threading.Thread heredan su estado demoníaco del subproceso de creación, por lo que si ese es el subproceso principal, también serán no demoníacos.

Esto significa que, de forma predeterminada, todos los subprocesos creados e iniciados por su progtwig principal evitarán que salga si todavía se están ejecutando cuando el subproceso principal finaliza (por sys.exit() o simplemente al golpear el final de su código). En otras palabras, el progtwig sale solo cuando no quedan hilos vivos que no sean del demonio (en otras palabras, solo los del demonio).

Puede anular este comportamiento predeterminado estableciendo explícitamente True la propiedad del daemon cualquier objeto de hilo creado en True antes de iniciarlo.

 if __name__=="__main__": t = threading.Thread(target=threadrun) t.daemon = True # Explicitly set property. t.start() sys.exit() 

Lo que permitirá que el progtwig finalice realmente cuando se sys.exit() (aunque llamarlo explícitamente así no es necesario ya que está al final de la secuencia de comandos).


Thread Un hilo de daemon es un hilo de baja prioridad que se ejecuta en segundo plano y no impide que el intérprete salga. Ver Explicación de Hilos Daemon .

✶✶ En Python 3.3, se agregó un argumento de palabra clave daemon al constructor de la clase Thread , lo que significa que, a partir de esa versión en adelante, simplemente puede usar:

  # Sets whether the thread is daemonic via "daemon" keyword argument. t = threading.Thread(target=threadrun, daemon=True) 

Sin embargo, hacerlo por separado a través de una statement de asignación de atributos explícita todavía funciona, y por lo tanto sería la forma más portátil de hacerlo.

Es fácil.

En su caso, el final del progtwig es cuando se terminará el último hilo. Tal vez el método de tipo join () (como en Java) en python esperará otros hilos. puedes cambiar while(true) para tener un método finito en el sentido del tiempo.

 def threadrun(): i=1000_000_000_000 while(i>0): i=i-1 time.sleep(1) 

y ver a otro comportarse tu progtwig.

de antemano perdon por mi ingles (:

y por favor, lea este artículo (: hay una buena explicación sobre cómo jugar con hilos en su caso Uso de hilos.Thread.join ()

y

documentación https://docs.python.org/2/library/threading.html (pero relájese, es solo para conocimiento adicional).

y lea este artículo sobre la propiedad del daemon (si no desea esperar a que otros subprocesos se conviertan en propiedad del daemon del hilo de Python)