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)
Según la documentación,
sys.exit()
plantea
SystemExit
:
Salga del intérprete elevando SystemExit (estado).
Si
SystemExit
alcanza el
controlador de excepción predeterminado
, llama a
handle_system_exit()
, que más o menos
Py_Finalize()
a
Py_Finalize()
, que a su vez llama
wait_for_thread_shutdown()
en Python 2, por lo que
sys.exit()
es lo mismo que la
caída
normal
la parte inferior del módulo principal
a la espera de que finalicen todos los subprocesos no daemon.
(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.