2011-01-10 14 views
14

Instalé Apio (última versión estable.) Tengo un directorio llamado /home/myuser/fable/jobs. Dentro de este directorio, tengo un archivo llamado tasks.py:¿Por qué funciona Apio en el shell de Python, pero no en mis vistas de Django? (problema de importación)

from celery.decorators import task 
from celery.task import Task 

class Submitter(Task): 
    def run(self, post, **kwargs): 
     return "Yes, it works!!!!!!" 

Dentro de este directorio, también tengo un archivo llamado celeryconfig.py:

BROKER_HOST = "localhost" 
BROKER_PORT = 5672 
BROKER_USER = "abc" 
BROKER_PASSWORD = "xyz" 
BROKER_VHOST = "fablemq" 

CELERY_RESULT_BACKEND = "amqp" 
CELERY_IMPORTS = ("tasks",) 

En mi /etc/profile, he establecido como éstos mi PYTHONPATH:

  • PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs

Así que corro a mi empleado de Apio usando la consola ($ celeryd --loglevel=INFO), y lo pruebo. Abro la consola de Python e importo las tareas. Luego, ejecuto el Remitente.

>>> import fable.jobs.tasks as tasks 
>>> s = tasks.Submitter() 
>>> s.delay("abc") 
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987> 

Todo funciona, como se puede ver en mi consola

[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s: 

Pero cuando entro en mi views.py de Django y ejecutar el exactos 3 líneas de código que el anterior, me sale esto:

[2011-01-09 17:25:20,298: ERROR/MainProcess] Unknown task ignored: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported.": {'retries': 0, 'task': 'fable.jobs.tasks.Submitter', 'args': ('abc',), 'expires': None, 'eta': None, 'kwargs': {}, 'id': 'eb5c65b4-f352-45c6-96f1-05d3a5329d53'} 
Traceback (most recent call last): 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/listener.py", line 321, in receive_message 
    eventer=self.event_dispatcher) 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 299, in from_message 
    eta=eta, expires=expires) 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 243, in __init__ 
    self.task = tasks[self.task_name] 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/registry.py", line 63, in __getitem__ 
    raise self.NotRegistered(str(exc)) 
NotRegistered: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported." 

Es extraño, porque el cliente apical muestra que está registrado cuando lo lanzo.

[2011-01-09 17:38:27,446: WARNING/MainProcess] 
Configuration -> 
    . broker -> amqp://[email protected]:5672/fablemq 
    . queues -> 
     . celery -> exchange:celery (direct) binding:celery 
    . concurrency -> 1 
    . loader -> celery.loaders.default.Loader 
    . logfile -> [stderr]@INFO 
    . events -> OFF 
    . beat -> OFF 
    . tasks -> 
     . tasks.Decayer 
     . tasks.Submitter 

¿Alguien puede ayudar?

+0

¿También está utilizando django-apio o solo apio por sí mismo? –

Respuesta

10

Creo que su archivo tasks.py debe estar en una aplicación django (que está registrado en settings.py) para poder ser importado. Alternativamente, puede intentar importar las tareas desde un archivo __init__.py en su proyecto principal o una de las aplicaciones.

tratan También a partir de celeryd manage.py:

$ python manage.py celeryd -E -B -lDEBUG 

(-E-B y puede o no ser necesario, pero eso es lo que yo uso).

+0

¿Qué quieres decir con "necesita estar en una aplicación django"? Tengo tasks.py como un archivo separado, e lo importo en mi views.py (import fable.jobs.tasks como tareas) – TIMEX

+0

Las tareas deben registrarse para que el apio pueda verlas. Eso no sucederá automáticamente en un archivo 'views.py', ya que Python no carga automáticamente ese archivo. Estoy bastante seguro de que Celery buscará automáticamente tareas en un archivo llamado 'tasks.py' que está en una aplicación de django, o puede intentar importar las tareas en un' __init __. Py'. – Seth

+0

¿Cómo es que cuando ejecuto el shell de python (en cualquier lugar), puede detectar y registrar las tareas? – TIMEX

5

de nomenclatura y relativas Las importaciones Ver automáticos, en los documentos:

http://celeryq.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

El nombre de tareas es "tasks.Submitter" (que se enumeran en la salida celeryd), pero importar la tarea como " fable.jobs.tasks.Submitter "

Supongo que la mejor solución aquí es si el trabajador también lo ve como" fable.jobs.tasks.Submitter ", tiene más sentido desde la perspectiva de una aplicación.

CELERY_IMPORTS = ("fable.jobs.tasks",) 
11

Esto es lo que hice, que finalmente funcionó

en Configuración.py añadí

CELERY_IMPORTS = ("myapp.jobs",) 

en la carpeta miaplicacion he creado un archivo llamado jobs.py

from celery.decorators import task 

@task(name="jobs.add") 
def add(x, y): 
    return x * y 

luego corrió desde la línea de comandos: python manage.py celeryd información -l

en otro proyectil me encontré pitón manage.py shell, entonces

>>> from myapp.jobs import add 
>>> result = add.delay(4, 4) 
>>> result.result 

y la i se obtiene:

Lo importante es que debe volver a ejecutar ambos comandos al agregar una nueva función. Debe registrar el nombre tanto en el cliente como en el servidor.

:-)

+0

Gracias por esta solución, es muy simple, pero estaba deteniendo el programa en mi proyecto. Deben incluir la línea CELERY_IMPORTS en el tutorial. – sequoia

+0

Gracias por publicar su solución. De hecho, me dijeron explícitamente que CELERY_IMPORTS no es necesario con django-apio, que djcelery.setup_loader() manejó eso, por un colaborador en #celery. Decepcionante que tuve que perseguir a un ganso salvaje innecesariamente. – mattdeboard

+1

-1 La documentación dice explícitamente que no se debe importar como "myapp.jobs". Sé que en este ejemplo está especificando el nombre, pero este ejemplo es mucho más confuso que hacerlo de la manera correcta. http://docs.celeryq.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports – citadelgrad

Cuestiones relacionadas