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