Estoy tratando de ejecutar un ejemplo de la documentación de Celery.
Corro: celeryd --loglevel=INFO
/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
"is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]
-------------- celery@ubuntu v2.5.1
---- **** -----
--- * *** * -- [Configuration]
-- * - **** --- . broker: amqp://guest@localhost:5672//
- ** ---------- . loader: celery.loaders.default.Loader
- ** ---------- . logfile: [stderr]@INFO
- ** ---------- . concurrency: 4
- ** ---------- . events: OFF
- *** --- * --- . beat: OFF
-- ******* ----
--- ***** ----- [Queues]
-------------- . celery: exchange:celery (direct) binding:celery
tasks.py:
# -*- coding: utf-8 -*-
from celery.task import task
@task
def add(x, y):
return x + y
run_task.py:
# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())
En la misma carpeta celeryconfig.py:
CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300
Cuando ejecuto "run_task.py":
en la consola de Python
eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False
errores en el servidor de celeryd
[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.
The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'
Explique cuál es el problema.
CELERY_IMPORTS = ("tasks", )
Respuestas:
Puede ver la lista actual de tareas registradas en la
celery.registry.TaskRegistry
clase. Podría ser que su configuración de apio (en el directorio actual) no esté en,PYTHONPATH
por lo que apio no puede encontrarla y vuelve a los valores predeterminados. Simplemente especifíquelo explícitamente al comenzar con el apio.También puede configurar
--loglevel=DEBUG
y probablemente debería ver el problema de inmediato.fuente
--loglevel=DEBUG
, hubo un error de sintaxis en mi tarea.celery worker
por ejemplo, paraDjango
estocelery --app=your_app.celery worker --loglevel=info
celery.registry.tasks
para ver una lista de todas mis tareas actuales. Siempre puedes comprobarlo corriendodir(celery.registry)
.--loglevel=DEBUG
de mi lado tambiénCreo que necesitas reiniciar el servidor trabajador. Encuentro el mismo problema y lo resuelvo reiniciando.
fuente
celery inspect registered
--autoreload
que reiniciará el apio cada vez que se cambie el código.Tuve el mismo problema: la razón
"Received unregistered task of type.."
fue que el servicio de apio no encontró ni registró las tareas al inicio del servicio (por cierto, su lista es visible cuando comienzas./manage.py celeryd --loglevel=info
).Estas tareas deben declararse en el
CELERY_IMPORTS = ("tasks", )
archivo de configuración.Si tiene un
celery_settings.py
archivo especial , debe declararse en el inicio del servicio de--settings=celery_settings.py
celeryd como escribió digivampire.fuente
Ya sea que use
CELERY_IMPORTS
oautodiscover_tasks
, lo importante es que las tareas se pueden encontrar y el nombre de las tareas registradas en Celery debe coincidir con los nombres que los trabajadores intentan buscar.Cuando inicie el Apio, digamos
celery worker -A project --loglevel=DEBUG
, debería ver el nombre de las tareas. Por ejemplo, si tengo unadebug_task
tarea en micelery.py
.Si no puede ver sus tareas en la lista, por favor verifica la importación de configuración de apio las tareas correctamente, ya sea en
--setting
,--config
,celeryconfig
oconfig_from_object
.Si está utilizando apio batido, asegúrese de que el nombre de la tarea
task
, que utiliza enCELERYBEAT_SCHEDULE
coincide con el nombre en la lista de tareas de apio.fuente
@task(name='check_periodically')
, debería coincidir con lo que puso en el calendario de tiempos, IE:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
También tuve el mismo problema; yo añadí
en mi
celeryconfig.py
archivo para solucionarlo.fuente
CELERY_IMPORTS = ['my_module']
por favor incluya = ['proj.tasks'] Necesita ir al directorio superior, luego ejecutar esto
no
en sus importaciones de entrada celeryconfig.py = ("path.ptah.tasks",)
por favor en otro módulo invocar tarea !!!!!!!!
fuente
include
parámetro debe agregarse si está utilizando importaciones relativas.please in other module invoke task!!!!!!!!
. Eso ayudo.El uso de --settings no funcionó para mí. Tuve que usar lo siguiente para que todo funcionara:
Aquí está el archivo celeryconfig que tiene CELERY_IMPORTS agregado:
Mi configuración fue un poco más complicada porque estoy usando supervisor para lanzar apio como un demonio.
fuente
Para mí, este error se resolvió asegurándome de que la aplicación que contiene las tareas se incluyera en la configuración INSTALLED_APPS de django.
fuente
Este problema surgió misteriosamente cuando agregué un poco de manejo de señales a mi aplicación django. Al hacerlo, convertí la aplicación para usar un AppConfig, lo que significa que en lugar de simplemente leer como
'booking
'enINSTALLED_APPS
, leyó'booking.app.BookingConfig'
.El apio no entiende lo que eso significa, así que agregué,
INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)
a mi configuración de django, y modifiqué micelery.py
dea
fuente
Lo que funcionó para mí fue agregar un nombre explícito al decorador de tareas de apio. Cambié mi declaración de tarea de
@app.tasks
a@app.tasks(name='module.submodule.task')
Aquí hay un ejemplo
fuente
Tuve el mismo problema al ejecutar tareas desde Celery Beat. Al apio no le gustan las importaciones relativas, así que en mi
celeryconfig.py
, tuve que establecer explícitamente el nombre completo del paquete:fuente
Esto, curiosamente, también puede deberse a que falta un paquete. Ejecute pip para instalar todos los paquetes necesarios:
pip install -r requirements.txt
autodiscover_tasks
no estaba recogiendo tareas que usaban paquetes faltantes.fuente
No tuve ningún problema con Django . Pero encontré esto cuando estaba usando Flask . La solución fue configurar la opción de configuración.
celery worker -A app.celery --loglevel=DEBUG --config=settings
mientras que con Django, acabo de tener:
python manage.py celery worker -c 2 --loglevel=info
fuente
También encontré este problema, pero no es lo mismo, así que solo para tu información. Las actualizaciones recientes provocan este mensaje de error debido a esta sintaxis de decorador.
ERROR/MainProcess] Received unregistered task of type 'my_server_check'.
@task('my_server_check')
Tuvo que cambiar a solo
@task()
No tengo ni idea de por qué.
fuente
Si está utilizando la configuración de aplicaciones en aplicaciones instaladas como esta:
Luego, en su aplicación de configuración, importe la tarea en un método listo como este:
fuente
Si se encuentra con este tipo de error, hay varias causas posibles, pero la solución que encontré fue que mi archivo de configuración de celeryd en / etc / defaults / celeryd estaba configurado para uso estándar, no para mi proyecto específico de django. Tan pronto como lo convertí al formato especificado en los documentos de apio , todo estuvo bien.
fuente
La solución para mí para agregar esta línea a / etc / default / celeryd
Porque cuando ejecuto estos comandos:
Solo el último comando mostraba nombres de tareas.
También intenté agregar la línea CELERY_APP / etc / default / celeryd, pero tampoco funcionó.
fuente
Tuve el problema con las clases PeriodicTask en django-celery, mientras que sus nombres aparecieron bien al iniciar el trabajador de apio con cada ejecución desencadenada:
KeyError: u'my_app.tasks.run '
Mi tarea era una clase llamada 'CleanUp', no solo un método llamado 'ejecutar'.
Cuando revisé la tabla 'djcelery_periodictask', vi entradas desactualizadas y eliminarlas solucionó el problema.
fuente
Solo para agregar mis dos centavos por mi caso con este error ...
Mi camino es
/vagrant/devops/test
conapp.py
y__init__.py
en él.Cuando corro
cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info
, recibo este error.Pero cuando lo ejecuto como si
cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info
todo estuviera bien.fuente
Descubrí que uno de nuestros programadores agregó la siguiente línea a una de las importaciones:
Esto hizo que el trabajador de Celery cambiara su directorio de trabajo del directorio de trabajo predeterminado de los proyectos (donde podría encontrar las tareas) a un directorio diferente (donde no pudo encontrar las tareas).
Después de eliminar esta línea de código, se encontraron y registraron todas las tareas.
fuente
El apio no admite importaciones relativas, por lo que en mi celeryconfig.py, necesita una importación absoluta.
fuente
Un elemento adicional a una lista realmente útil.
Encontré que Celery no perdona en relación con los errores en las tareas (o al menos no he podido rastrear las entradas de registro apropiadas) y no las registra. He tenido una serie de problemas con la ejecución de Celery como servicio, que se han relacionado principalmente con permisos.
Lo último relacionado con la escritura de permisos en un archivo de registro. No tuve problemas en el desarrollo ni en la ejecución de apio en la línea de comandos, pero el servicio informó que la tarea no estaba registrada.
Necesitaba cambiar los permisos de la carpeta de registro para permitir que el servicio escribiera en ella.
fuente
Mis 2 centavos
Obtenía esto en una imagen de Docker usando alpine. La configuración de django a la que se hace referencia
/dev/log
para iniciar sesión en syslog. La aplicación de django y el trabajador de apio se basaron en la misma imagen. El punto de entrada de la imagen de la aplicación django se estaba iniciandosyslogd
al inicio, pero no el del trabajador de apio. Esto estaba causando que cosas como./manage.py shell
fallasen porque no habría ninguna/dev/log
. El trabajador del apio no estaba fallando. En cambio, ignoraba silenciosamente el resto del lanzamiento de la aplicación, que incluía cargarshared_task
entradas de aplicaciones en el proyecto django.fuente
En mi caso, el error se debió a que un contenedor creó archivos en una carpeta que se montaron en el sistema de archivos del host con docker-compose.
Solo tenía que eliminar los archivos creados por el contenedor en el sistema host y pude lanzar mi proyecto nuevamente.
(Tuve que usar sudo porque los archivos eran propiedad del usuario root)
Versión de Docker: 18.03.1
fuente
Si lo usa
autodiscover_tasks
, asegúrese de que sufunctions
registro permanezca en eltasks.py
, no en ningún otro archivo. O el apio no puede encontrar elfunctions
que desea registrar.Utilizar
app.register_task
también servirá, pero parece un poco ingenuo.Consulte esta especificación oficial de
autodiscover_tasks
.fuente
Escriba la ruta correcta a las tareas del archivo
}
fuente
al ejecutar el apio con el comando "celery -A conf worker -l info", todas las tareas se enumeran en el registro como yo. conf.celery.debug_task Recibí el error porque no estaba dando esta ruta de tarea exacta. Así que, por favor, vuelva a comprobar esto copiando y pegando la identificación exacta de la tarea.
fuente
fuente
La respuesta a sus mentiras de problemas en la primera línea de la salida que ya ha proporcionado en su pregunta:
/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python. "is available to Python." % (configname, )))
. Sin la configuración correcta, Celery no puede hacer nada.La razón por la que no puede encontrar la configuración de apio es muy probable que no esté en su PYTHONPATH.
fuente
He resuelto mi problema, mi 'tarea' está en un paquete de Python llamado 'celery_task', cuando salgo de este paquete y ejecuto el comando
celery worker -A celery_task.task --loglevel=info
. Funciona.fuente