2011-12-29 15 views
7

Ho bisogno di gestire un processo di grandi dimensioni (che richiede tempo e consumo di memoria) in modo asincrono in un'applicazione web2py chiamata all'interno di un metodo controller.Processi in background asincroni con web2py

Il mio caso d'uso specifico è chiamare un processo tramite stdlib.subprocess e attendere che esca senza bloccare il server web, ma sono aperto a metodi alternativi.

  • Gli esempi pratici sarebbero un vantaggio.
  • Le librerie di terze parti sono benvenute.
  • La pianificazione CRON non è richiesta/richiesta.

risposta

7

Supponendo che sia necessario avviare più istanze, possibilmente simultanee, dell'attività di background, la soluzione è una coda di attività. Ho sentito cose positive su Celery e RabbitMQ, se stai cercando opzioni di terze parti e web2py include il sistema it's own task queue che potrebbe essere sufficiente per le tue esigenze.

Con entrambi gli strumenti, definirai una funzione che incapsula l'operazione che vuoi che il processo in background esegua. Quindi portare in coda i lavoratori della coda delle attività. Il manuale e i forum di web2py indicano che ciò può essere fatto con un'istruzione @reboot nel sistema cron di web2py, che viene attivata ogni volta che il server Web viene avviato. Ci sono probabilmente altri modi per avviare i lavoratori se questo non è soddisfacente.

Nel controller verrà inserita un'attività nella coda delle attività, passando tutti i parametri necessari come input alla funzione (la funzione di sfondo non verrà eseguita nello stesso ambiente del controller, quindi non avrà accesso a la sessione, il DB, ecc. a meno che non si passino esplicitamente i valori appropriati nella funzione compito).

Ora, per ottenere l'output dell'operazione in background per l'utente. Quando si inserisce un'attività nella coda delle attività, è necessario recuperare un ID univoco per l'attività. Dovresti quindi implementare la logica del controller (o qualcosa che si aspetta una chiamata AJAX o una pagina che si aggiorna fino al completamento dell'attività) che richiama l'API della coda delle attività per controllare lo stato dell'attività specificata. Se lo stato dell'attività è "finito", restituire i dati all'utente. Se no, continua ad aspettare.

+0

Penso che l'utilità di pianificazione integrata fosse proprio quello che stavo cercando. –

1

Questo è più difficile di quanto ci si potrebbe aspettare. Annotare gli avvisi di deadlock nel numero stdlib.subprocess documentation. È facile se non ti dispiace bloccare --- usa Popen.communicate. Per aggirare il blocco, è possibile gestire il processo utilizzando stdlib.subprocess da un thread.

Il mio modo preferito per gestire i sottoprocessi è utilizzare Twisted's spawnProcess. Ma non è facile per Twisted giocare bene con altri framework.

Problemi correlati