2009-11-11 12 views
7

In Python sotto Windows: voglio eseguire del codice in un processo separato. E non voglio che il genitore attenda che finisca. Provato questo:Esegui un processo ed esci senza attenderlo

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() 

che avvia il processo figlio e continua l'esecuzione. Tuttavia, quando il genitore raggiunge la fine, attende comunque che il bambino esca.

C'è un modo per far uscire il genitore anche quando il bambino è in esecuzione? Certo, potrei semplicemente eseguire un nuovo interprete python usando subprocess.Popen e dare ad esso il conteggio delle pecore come uno script separato.

Ancora, c'è questo intero modulo per giocare con i processi di codice Python, quindi mi piacerebbe approfittarne al posto di hackerare sul sistema operativo. Inoltre, sarebbe fantastico se lo stesso codice funzionasse ovunque in Python, non solo su Windows.

+0

Qui intorno di solito vedo il problema opposto. – mob

risposta

4

Utilizzare il modulo subprocess come altri metodi di controllo sottoprocesso (. Os.system, os.spawn *, os.popen *, popen2 , comandi.) Vengono obsoleti:

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

See the Python doco, specialmente P_NOWAIT esempio.

Dovrai avviare un nuovo interprete Python nel sottoprocesso, quindi "foo.exe" sarà probabilmente "python.exe".

EDIT:

Avendo appena esaminato la documentazione del modulo multiprocessing:

join_thread(): Partecipa al fondo thread. Può essere utilizzato solo dopo close() è stato chiamato. Blocca fino all'uscita dal thread in background, assicurandosi che tutti i dati nel buffer siano stati scaricati nella pipe.

Per impostazione predefinita, se un processo non è il creatore della coda poi uscire esso tenterà di unirsi a filo sfondo della coda. Il processo può chiamare cancel_join_thread() per rendere join_thread() non fare nulla.

cancel_join_thread(): Impedire join_thread() dal blocco. In particolare, in , il thread di sfondo viene aggiunto automaticamente allo automaticamente alla chiusura del processo - vedere join_thread().

Sembra che dovresti essere in grado di chiamare cancel_join_thread() per ottenere il comportamento desiderato. Non ho mai usato questo metodo (e non ne ero consapevole fino a un minuto fa!), Quindi assicurati di farci sapere se funziona per te.

+0

Si prega di non importare *. –

+0

Certo - rimosso l'importazione * –

+0

cancel_join_thread() sembra essere per qualcos'altro: in modo che il processo possa uscire anche quando una coda che usa non è vuota. Tuttavia, a meno che non ci sia una coda creata e riempita in modo invisibile nel mio esempio, non penso che questo mi aiuterebbe qui. –

1

Sotto Linux è possibile fork ma questo non funzionerà su Windows.Penso che il modo più semplice è quello di eseguire un nuovo processo Python, mettendo il count_sheeps in un file separato e Popen('python count_sheeps.py')

+0

Concordato: l'unica difficoltà è eseguire il marshalling degli argomenti sul metodo. Abbastanza facile per count_sheeps (numero), dove "numero" è un numero intero. Per argomenti complessi, il metodo multiprocessing.Process è un approccio intelligente! –

+0

Sì, è la forchetta pitty non su Windows. Sembra che dovrò seguire questa strada. –

-2

È sempre possibile avviare un nuovo thread, e chiamare myNewThread.daemon (True) prima di richiamare è metodo start() .

Tale thread continuerà a essere eseguito quando si chiude il processo principale.

+0

Grazie, ma non proprio. I thread dei daemon vengono uccisi quando il programma principale viene chiuso. La differenza tra thread non demoni è che il programma li uccide semplicemente invece di aspettare che finiscano da soli. –

+0

Il thread daemon AFAICT è esattamente ciò che è necessario nella domanda originale. È vero però che i thread del demone non sono rimasti in esecuzione, che non era corretto in questa risposta. – ketorin

2

È possibile dichiarare il processo come daemon con p.daemon = True. Come dice http://docs.python.org/2/library/threading.html#thread-objects: "Il significato di questo flag è che l'intero programma Python si chiude quando rimangono solo i thread 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() 
Problemi correlati