2011-12-19 6 views
6

Tengo dos servidores: uno que ejecuta una aplicación django y otro que ejecuta tanto una cola rabbitmq como un apio. Mi tasks.py en el servidor que ejecuta la cola/trabajador contiene una tarea de la siguiente manera:Ejecutar una tarea de Apio cuando no se puede importar esa tarea

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

Mi objetivo es ejecutar esta tarea desde una vista de Django. Como el código para la tarea está en un servidor diferente de la vista de django, me gustaría llamar a la tarea, estoy tratando de usar el siguiente código para enviar la tarea desde django a la máquina de trabajo.

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

me encontré con este método here, pero hasta ahora las pruebas que no ha funcionado.

Estoy probando con tail -F en el archivo de registro del trabajador de apio en el servidor de apio trabajador, luego navegando a la URL de la vista que contiene send_task en un navegador. Estoy buscando que la tarea aparezca como 'recibida' en el resultado final, pero no es así.

El nivel de registro del trabajador de apio es DEPURAR, el archivo de registro muestra que la tarea está registrada con el nombre propio, y la configuración de django settings.py contiene la IP y las credenciales correctas para el servidor rabbitmq. Al probar diferentes enfoques, de vez en cuando veo un mensaje de error en el archivo de registro de apio cuando cambio la cadena que pasó a send_task a algo que no era una tarea válida (es decir, send_task ('asdf')). Esto causó un error no registrado en el archivo de registro. Sin embargo, esto solo sucede a veces, y hasta ahora al probar diferentes combinaciones de configuraciones y llamadas, no he encontrado una manera de replicar de manera confiable el comportamiento.

Además, esta es la sección correspondiente del settings.py en el proyecto Django (con valores reales eliminado):

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 alrededor y no he encontrado mucho en send_task. ¿Alguna idea sobre lo que podría estar haciendo mal?

+0

Me gustaría saber cómo compartió su código entre ambas máquinas. Aquí hay una pregunta que escribí relacionada con eso: http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server ¡Gracias! – lajarre

Respuesta

7

Resuelto, resulta que la palabra clave edg que estaba pasando a send_task no es válida y arroja un error. No vi el error porque estaba AJAX-solicitando la página en lugar de navegar directamente. Todo lo demás sobre esta situación era correcto. También eliminé las palabras clave innecesarias args y args que se pasan a send_task.

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

Lo que [pensé que estabas] tratando de hacer es imposible. Los trabajadores de apio requieren acceso al código de tarea que deben ejecutar. No hay forma de evitar eso.

Revisado:

Pero lo que realmente quiere hacer es: tener el código a disposición de los trabajadores, pero no a la vista de Django, que debería referirse a las tareas sólo por su nombre.

+0

Tiene toda la razón que los trabajadores de apio requieren el código que ejecutarán, pero creo que usted no entendió parte de la publicación original. Para que quede claro, el trabajador tiene el código de la tarea, es la * llamada * de la tarea que me gustaría que ocurra de forma remota. Entonces, la vista django le dice al trabajador que ejecute la tarea. –

+0

¡Revisado revisado! – dkamins

Cuestiones relacionadas