Domanda

    

Questa domanda ha già una risposta qui:

         

Sto creando un po 'di dashboard per un utente che gli permetterà di eseguire lavori specifici. Sto usando Django quindi voglio che lui sia in grado di fare clic su un collegamento per avviare il lavoro e poi tornare alla pagina di nuovo a lui con un messaggio che il processo è in esecuzione. I risultati del lavoro saranno inviati via email a lui più tardi.

Credo che dovrei usare subprocess.Popen ma non sono sicuro di questo. Quindi, in pseudocodice, qui è quello che voglio fare:

if job == 1:
    run script in background: /path/to/script.py
    return 'Job is running'
È stato utile?

Soluzione

p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.STDOUT)

che avvierà il sottoprocesso in background. Lo script continuerà a funzionare normalmente.

Leggi la documentazione rel="noreferrer"> .

Altri suggerimenti

L'esecuzione di questo attraverso una coda di messaggi è sicuramente la strada da percorrere se si sta pensando di ridimensionamento a lungo termine. Invia un messaggio alla coda che è costantemente in esecuzione in background, e scrivere i gestori di lavoro per affrontare i diversi tipi di messaggi.

Dal momento che si sta utilizzando Django, penso Beanstalkd è un buon in forma. Ecco una bella bel tutorial su il soggetto. Il primo commento in questo articolo ha anche alcuni buoni consigli.

Personalmente ho arrotolato con un costume in memoria del server della coda scritto in Erlang, con Python-binding scritte in C. Ma Redis sembra che potrebbe funzionare come un grande contendente per il futuro di accodamento / messaggistica-needs. Spero che questo aiuta!

subprocess.Popen è davvero quello che stai cercando.

Anche se si scopre che si desidera iniziare a comunicare una serie di informazioni tra il sottoprocesso e il genitore, si può prendere in considerazione un filo, o di un quadro RPC come ritorto.

Ma molto probabilmente quelli sono troppo pesanti per la vostra applicazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top