2013-02-06 12 views
6

1) Attualmente sto lavorando ad un'applicazione web che espone una API REST e utilizza Django e Celery per gestire la richiesta e risolverli. Per una richiesta al fine di essere risolti, è necessario inviare una serie di attività di sedici su una coda amqp, in modo che vengano eseguite sui lavoratori (situate su altre macchine). Ogni attività richiede molta CPU e impiega molto tempo (ore) a terminare.Progetto Django-celery, come gestire i risultati del risultato-backend?

Ho configurato Celery per utilizzare anche amqp come risultato-backend e sto usando RabbitMQ come broker di Celery.

Ogni attività restituisce un risultato che deve essere memorizzato successivamente in un DB, ma non direttamente dai lavoratori. Solo il "nodo centrale" - la macchina che esegue django-sedan e le attività di pubblicazione nella coda RabbitMQ - ha accesso a questo DB di archiviazione, quindi i risultati degli operatori devono tornare in qualche modo su questa macchina.

La domanda è: come posso elaborare i risultati dell'esecuzione delle attività in seguito? Quindi, dopo che un operatore ha terminato, il risultato da esso viene memorizzato nel back-end dei risultati configurato (amqp), ma ora non so quale sarebbe il modo migliore per ottenere i risultati da lì ed elaborarli.

Tutto quello che ho potuto trovare nella documentazione è che è possibile controllare lo stato del risultato di tanto in tanto con:

result.state 

il che significa che, in fondo ho bisogno di un pezzo dedicato di codice che viene eseguito periodicamente questo comando , e quindi tiene occupato un filo intero/processo solo con questo, o per bloccare il tutto con:

result.get() 

fino a quando un compito finisce, che non è quello che desidero.

L'unica soluzione che viene in mente è quello di avere il "nodo centrale" di un filo in più che viene eseguito periodicamente una funzione che controlla essenzialmente sulle async_results restituiti da ogni compito a sua presentazione, e di agire se l'attività ha uno stato finito.

Qualcuno ha qualche altro suggerimento?

Inoltre, poiché l'elaborazione dei risultati backend avviene sul "nodo centrale", l'obiettivo è minimizzare l'impatto di questa operazione su questa macchina.

Quale sarebbe il modo migliore per farlo?

2) In che modo la gente di solito risolve il problema di gestire i risultati restituiti dai lavoratori e inserire i risultati del backend? (presupponendo che sia stato configurato un backend)

+0

Un utente di attività sedano sul "nodo centrale". L'obiettivo di questo consumatore è quello di salvare i dati nel database. Funziona solo quando i dati vengono trovati nel jobqueue, quindi non è periodico. – Crazyshezy

risposta

1

Non sono sicuro di comprendere appieno la domanda, ma di tenere conto che ogni attività ha un ID attività. Se le attività vengono inviati dagli utenti è possibile memorizzare gli ID e poi controllare per i risultati utilizzando JSON come segue:

#urls.py 
from djcelery.views import is_task_successful 

urlpatterns += patterns('', 
    url(r'(?P<task_id>[\w\d\-\.]+)/done/?$', is_task_successful, 
     name='celery-is_task_successful'), 
    ) 

altro concetto correlato è quello di signals ogni attività finito emette un segnale. Un'attività finita emetterà un segnale task_success. Più può essere trovato su real time proc.

+0

Sì, e il problema era che ho bisogno di un consumatore di eventi, al fine di catturare i segnali o qualcosa di controllare di volta in volta lo stato del compito ... e questo è indipendente dalla parte che invia i lavori, perché io wouldn Non voglio bloccare il processo di invio del lavoro con il looping degli ID delle attività ... La domanda è: come fanno le persone di solito a farlo? – Clara

+0

Ok, penso di aver trovato la mia risposta nel link che mi hai inviato riguardo il proc in tempo reale. Grazie! – Clara

Problemi correlati