2009-11-11 15 views
7

En Python en Windows: deseo ejecutar algún código en un proceso por separado. Y no quiero que el padre espere que termine. Intenté esto:Ejecute un proceso y salga sin esperarlo

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit() 

que inicia el proceso hijo y continúa ejecutándose. Sin embargo, cuando el padre llega al final, todavía espera que el niño salga.

¿Hay una manera de dejar que el padre abandonó incluso cuando el niño está en funcionamiento? Claro, podría simplemente ejecutar un nuevo intérprete de Python usando subprocess.Popen y darle el recuento de ovejas como un guión separado.

Aún así, hay todo este módulo para jugar con los procesos de código Python, así que me gustaría tomar ventaja de que en lugar de la piratería en el sistema operativo. Además, sería increíble si el mismo código funcionara en todas partes donde lo hace Python, no solo en Windows.

+0

Por aquí suelo ver el problema opuesto. – mob

Respuesta

4

Uso del módulo subprocess como otros métodos de control de subprocesos (. Os.system, os.spawn *, os.popen *, popen2 , comandos.) Se están en desuso:

from subprocess import Popen 
Popen([ "foo.exe", "arg1", "arg2", "arg3") 

See the Python doco, especialmente P_NOWAIT ejemplo.

Usted tendrá que empezar un nuevo intérprete de Python en el sub-proceso, por lo que "foo.exe" por encima probablemente será "python.exe".

EDIT:

Habiendo examinado la documentación del módulo de multiprocesamiento:

join_thread(): Inscripción en el fondo hilo. Esto solo se puede usar después de llamar al close(). Bloquea hasta el fondo hilo termina, asegurar que todos los datos en el buffer se ha volcado a la tubería.

Por defecto, si un proceso no es el creador de la cola y luego a la salida que intentará unirse a rosca fondo de la cola. El proceso puede llamar al cancel_join_thread() para hacer join_thread() no hacer nada.

cancel_join_thread(): Prevenir join_thread() de bloqueo. En particular, esto evita que el hilo fondo de ser unido a automáticamente cuando el proceso sale - ver join_thread().

Parece que debe poder llamar al cancel_join_thread() para obtener el comportamiento que desee. Nunca utilicé este método (¡y no me di cuenta de su existencia hasta hace un minuto!), Así que asegúrese de informarnos si funciona para usted.

+0

Por favor, no 'importe *'. –

+0

Sure - eliminó la importación * –

+0

cancel_join_thread() parece ser para otra cosa: por lo que el proceso puede salir incluso cuando una cola que utiliza no está vacía. Sin embargo, a menos que haya una cola creada silenciosamente y rellenada en mi ejemplo, no creo que esto me ayude aquí. –

1

Bajo Linux podría fork pero esto no va a funcionar en Windows.Creo que la forma más fácil es ejecutar un nuevo proceso de Python, poniendo su count_sheeps en un archivo separado y Popen('python count_sheeps.py')

+0

De acuerdo: la única dificultad es reunir argumentos para el método. Lo suficientemente fácil para count_sheeps (number), donde "number" es un entero. Para argumentos complejos, el método multiprocesamiento.Proceso es un enfoque inteligente. –

+0

Sí, es que Pitty Fork no está en Windows. Parece que tendré que seguir esta ruta. –

-2

Siempre se puede empezar un nuevo hilo, y el método de llamar myNewThread.daemon (Verdadero) antes de invocar se start() .

Ese subproceso continuará ejecutándose cuando el proceso principal finalice.

+0

Gracias, pero no realmente. Los hilos Daemon se eliminan cuando sale el programa principal. La diferencia de los hilos no-demoníacos es que el programa simplemente los mata en lugar de esperar que terminen solos. –

+0

El hilo de daemon AFAICT es exactamente lo que se necesita en la pregunta original. Sin embargo, es cierto que los hilos daemon no se dejan en ejecución, eso fue incorrecto en esta respuesta. – ketorin

2

Puede declarar el proceso como daemon con p.daemon = True. Como dice http://docs.python.org/2/library/threading.html#thread-objects: "El significado de esta bandera es que todo el programa Python sale cuando solo quedan subprocesos de daemon".

from multiprocessing import Process 
from time import sleep 

def count_sheeps(number): 
    """Count all them sheeps.""" 
    for sheep in range(number): 
     sleep(1) 

if __name__ == "__main__": 
    p = Process(target=count_sheeps, args=(5,)) 
    p.daemon = True 
    p.start() 
    print("Let's just forget about it and quit here and now.") 
    exit() 
Cuestiones relacionadas