2011-12-19 10 views
6

Ho due server: uno con un'applicazione django e uno che esegue sia una coda rabbitmq che un operatore di sedano. Il mio tasks.py sul server che esegue la coda/operaio contiene un'attività come segue:Esecuzione di un'attività di Celery quando non è possibile importare quell'attività

@task(queue="reports") 
def test_task(): 
    time.sleep(120) 

Il mio obiettivo è quello di eseguire questo compito da una vista Django. Poiché il codice per l'attività si trova su un server diverso rispetto alla vista di django, mi piacerebbe chiamare l'attività, sto cercando di utilizzare il codice seguente per inviare l'attività da django alla macchina worker.

send_task("tasks.test_task", task_id=task_id, args=[], kwargs={}, publisher=publisher, queue=queue) 

Ho trovato questo metodo here, ma finora il test non ha funzionato.

Sto testando con tail -F sul file di log di sedici operatori sul server di Celery worker, quindi navigando all'URL della vista che contiene send_task in un browser. Sto cercando il compito di presentarsi come 'ricevuto' nell'output della coda, ma non è così.

Il livello di log del worker di sedano è DEBUG, il file di log mostra che l'attività è registrata con il nome corretto e settings.py dell'app django contiene l'IP corretto e le credenziali per il server rabbitmq. Nel provare approcci diversi, occasionalmente ho visto un messaggio di errore nel file di log di sedici quando ho cambiato la stringa passata a send_task in qualcosa che non era un'attività valida (ad esempio send_task ('asdf')). Ciò ha causato un errore Unregistered nel file di registro. Tuttavia, questo accade solo a volte, e finora nel testare diverse combinazioni di impostazioni e chiamate, non ho trovato un modo per replicare in modo affidabile il comportamento.

Inoltre, questa è la sezione dedicata del settings.py sul progetto Django (con i valori effettivi rimosso):

CELERY_RESULT_BACKEND = 'amqp' 
BROKER_HOST = 'the.correct.IP.address' 
BROKER_USER = 'the_correct_user' 
BROKER_PASSWORD = 'the_correct_pass' 
BROKER_VHOST = 'the_correct_vhost' 
BROKER_PORT = 5672 

Googled intorno e non ho trovato molto su send_task. Qualche idea su cosa potrei fare male?

+0

Sarei interessato a sapere come hai condiviso il codice tra entrambe le macchine. Ecco una domanda che ho scritto relativa a questo: http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server Grazie! – lajarre

risposta

7

Risolto, si scopre che la parola chiave del publisher che stavo passando a send_task non era valida e generava un errore. Non ho visto l'errore perché ero AJAX-richiedendo la pagina piuttosto che navigandoci direttamente. Tutto il resto di questa situazione era corretto. Ho anche rimosso le parole inutili args e gli argomenti passati a send_task.

send_task("tasks.test_task", task_id=task_id, queue=queue) 
2

Quello che [pensavo fossi] cercando di fare è impossibile. I lavoratori di Celery richiedono l'accesso al codice attività che devono eseguire. Non c'è modo di aggirare questo.

rivisto:

Ma che cosa si vuole veramente fare è: avere il codice a disposizione dei lavoratori, ma non alla vista Django, che dovrebbe fare riferimento a compiti solo di nome.

+0

Hai assolutamente ragione che i lavoratori del sedano richiedono il codice che correranno, ma penso che tu abbia frainteso parte del post originale. Per essere chiari, il lavoratore ha il codice attività su di esso - è il * richiamo * dell'attività che mi piacerebbe accadere in remoto. Quindi la vista di django dice all'operatore di eseguire l'operazione. –

+0

Revisionato revisionato! – dkamins