2011-07-28 18 views
11

UDATE3: encontró el problema. Vea la respuesta a continuación.Django Apio tutorial no devuelve resultados

ACTUALIZACIÓN2: Parece que tuve que lidiar con un problema automático de nomenclaturas y importaciones relativas ejecutando el tutorial de djcelery a través del shell manage.py, ver debajo. Todavía no funciona para mí, pero ahora recibo nuevos mensajes de error de registro. Vea abajo.

ACTUALIZACIÓN: He añadido el registro en la parte inferior de la publicación. Parece que la tarea de ejemplo no está registrada?

Post original:

Estoy intentando conseguir django-apio en funcionamiento. No pude resolver el ejemplo.

He instalado RabbitMQ con éxito y se fue a través de los tutoriales y sin problemas: http://www.rabbitmq.com/getstarted.html

Luego trató de pasar por el tutorial djcelery.

Cuando corro python manage.py celeryd -l info consigo el mensaje: [Tareas] - app.module.add [2011-07-27 21:17:19, 990: ADVERTENCIA/MainProcess] apio @ secuoya ha comenzado.

Así que se ve bien. Pongo esto en la parte superior de mi configuración del archivo:

import djcelery 
djcelery.setup_loader() 

BROKER_HOST = "localhost" 
BROKER_PORT = 5672 
BROKER_USER = "guest" 
BROKER_PASSWORD = "guest" 
BROKER_VHOST = "/" 

añaden estos para mis aplicaciones instaladas:

'djcelery', 

aquí está mi archivo tasks.py en la carpeta de tareas de mi aplicación:

from celery.task import task 

@task() 
def add(x, y): 
    return x + y 

he añadido esto a mi archivo django.wsgi:

os.environ["CELERY_LOADER"] = "django" 

Luego entré en esto en la línea de comandos:

>>> from app.module.tasks import add 
>>> result = add.delay(4,4) 
>>> result 
(AsyncResult: 7auathu945gry48- a bunch of stuff) 
>>> result.ready() 
False 

lo que parece que funcionó, pero aquí está el problema:

>>> result.result 
>>>    (nothing is returned) 
>>> result.get() 

Cuando pongo en result.get() simplemente se cuelga. ¿Qué estoy haciendo mal?

ACTUALIZACIÓN: Esto es lo que ejecuta el registrador en el primer plano dice cuando inicio el servidor trabajador:

No handlers could be found for logger “multiprocessing” 

[Configuration] 
- broker:  amqplib://[email protected]:5672/ 
- loader:  djcelery.loaders.DjangoLoader 
- logfile:  [stderr]@INFO 
- concurrency: 4 
- events:  OFF 
- beat:  OFF 

[Queues] 
- celery:  exchange: celery (direct) binding: celery 

[Tasks] 
- app.module.add 
[2011-07-27 21:17:19, 990: WARNING/MainProcess] [email protected] has started. 

C:\Python27\lib\site-packages\django-celery-2.2.4-py2.7.egg\djcelery\loaders.py:80: UserWarning: Using settings.DEBUG leads to a memory leak, neveruse this setting in production environments! 
    warnings.warn(“Using settings.DEBUG leads to a memory leak, never” 

entonces cuando pongo en el comando:

>>> result = add(4,4) 

Esto parece en el registro de errores:

[2011-07-28 11:00:39, 352: ERROR/MainProcess] Unknown task ignored: Task of kind ‘task.add’ is not registered, please make sure it’s imported. Body->”{‘retries’: 0, ‘task’: ‘tasks.add’, ‘args’: (4,4), ‘expires’: None, ‘ta’: None 
    ‘kwargs’: {}, ‘id’: ‘225ec0ad-195e-438b-8905-ce28e7b6ad9’}” 
Traceback (most recent call last): 
    File “C:\Python27\..\celery\worker\consumer.py”,line 368, in receive_message 
     Eventer=self.event_dispatcher) 
    File “C:\Python27\..\celery\worker\job.py”,line 306, in from_message 
     **kw) 
    File “C:\Python27\..\celery\worker\job.py”,line 275, in __init__ 
     self.task = tasks[self.task_name] 
    File “C:\Python27\...\celery\registry.py”, line 59, in __getitem__ 
     Raise self.NotRegistered(key) 
NotRegistered: ‘tasks.add’ 

¿Cómo puedo obtener th ¿la tarea debe registrarse y manejarse correctamente? Gracias.

ACTUALIZACIÓN 2:

Este enlace sugiere que el error no registrado puede ser debido a desajustes nombre de la tarea entre el cliente y el trabajador - http://celeryproject.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

salido del manage.py shell y entró en una cáscara de pitón y ingresó lo siguiente:

>>> from app.module.tasks import add 
>>> result = add.delay(4,4) 
>>> result.ready() 
False 
>>> result.result 
>>>     (nothing returned) 
>>> result.get() 
        (it just hangs there) 

así que estoy obteniendo el mismo comportamiento, pero nuevo mensaje de registro. Desde el registro, parece que el servidor está funcionando pero no va a alimentar el resultado de vuelta:

[2011-07-28 11:39:21, 706: INFO/MainProcess] Got task from broker: app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3] 
[2011-07-28 11:39:21, 706: INFO/MainProcess] Task app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3] succeed in 0.04600000038147s: 8 

Así que el servidor tiene la tarea y se calcula la respuesta correcta, pero no va a enviar de nuevo? ¿Por qué no?

+0

¿Estás usando Windows? Se han recibido informes de que los resultados no funcionan en Windows para Apio 3 – asksol

+0

Sí, estoy usando Windows. Estoy a punto de volver a visitar el proyecto que utiliza rabbitmq y apio. Voy a tener en cuenta tus comentarios entonces. En general, he estado muy feliz con los dos. – sequoia

Respuesta

14

he encontrado la solución a mi problema desde otro post StackOverflow: Why does Celery work in Python shell, but not in my Django views? (import problem)

he tenido que añadir estas líneas al archivo de configuración:

CELERY_RESULT_BACKEND = "amqp" 
CELERY_IMPORTS = ("app.module.tasks",) 

a continuación en el archivo task.py puse el nombre de la tarea como tal:

@task(name="module.tasks.add") 

El servidor y el cliente tuvieron que ser informados de los nombres de las tareas. Los tutoriales de apio y django-apio omiten estas líneas en sus tutoriales.

+1

No puedo creer que hayan omitido estas líneas cruciales cruciales en los documentos de apio django ..... – Tony

+2

@Tony vea la nota sobre Importaciones relativas a continuación en http://docs.celeryproject.org/en/latest/django/first- steps-with-django.html # defining-and-calling-tasks No es un problema a menos que use importaciones relativas, y se desaconsejan las importaciones relativas en Python – asksol

+0

Tuve un problema similar y si las importaciones relativas tienen algo que ver con eso , el bit CELERY_RESULT_BACKEND = 'amqp' es necesario. – CrazyCasta

4

si ejecuta el apio en modo de depuración es más fácil entender el problema

python manage.py celeryd 

Lo que el troncos de apio dice, apio está recibiendo la tarea? Si no es así, probablemente hay un problema con el corredor (? Cola equivocada)

Danos más detalle, de esta manera podemos ayudarle a

+0

¿dónde se almacena el archivo de registro? No puedo encontrarlo. ¿Sería el registro rabbitmq? ¿u otro? Agregué el texto de ejecutar el registrador en primer plano a mi publicación anterior. Gracias. – sequoia

Cuestiones relacionadas