python multithreading exit

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



multithreading (3)

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 programa 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 programa en Linux, el resultado no fue el esperado, como dice la documentación de Python, pero aún se ejecuta en el sistema, entonces, ¿qué hace realmente sys.exit() ?


Es fácil.

En su caso, el final del programa es cuando se terminará el último subproceso. Tal vez el tipo de método join () (como en Java) en python esperará otros hilos. puede 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 observe otro comportamiento de su programa.

y por favor, lea este artículo (: hay una buena explicación de 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 demonio (si no desea esperar a que otros hilos se conviertan en propiedad del demonio de hilos Python terminado)



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

Normalmente, un programa Python sale solo cuando no quedan más que hilos de daemon (ignorándose a sí mismo) que se ejecutan. El objeto "hilo principal" que corresponde al hilo de control inicial en el programa no es un hilo de demonio. Subprocesos creados con 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 daemónicos.

Esto significa que, de manera predeterminada, cualquier subproceso creado e iniciado por su programa principal evitará que salga si todavía se está ejecutando cuando el subproceso principal finaliza (mediante sys.exit() o simplemente sys.exit() el final de su código). En otras palabras, el programa sale solo cuando no quedan hilos vivos que no sean daemon (en otras palabras, solo quedan demonios).

Puede anular este comportamiento predeterminado estableciendo explícitamente property 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 programa realmente finalice cuando se llama a sys.exit() (aunque llamarlo explícitamente así no es necesario ya que de todos modos está al final del script).

Thread Un hilo de demonio 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 de demonio .

Py 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 declaración explícita de asignación de atributos todavía funciona y, por lo tanto, sería la forma más portátil de hacerlo.