tasks run periodic autodiscover async python django celery django-celery celery-task

python - run - Tarea de apio estado siempre pendiente.



django celery rabbitmq (3)

Directamente desde el documento: el backend del resultado no funciona o las tareas están siempre en estado PENDIENTE .

Todas las tareas están PENDING de forma predeterminada, por lo que el estado se habría denominado mejor "desconocido". El apio no actualiza ningún estado cuando se envía una tarea, y se supone que cualquier tarea sin historial está pendiente (después de todo, conoce el id la tarea).

  1. Asegúrese de que la tarea no tenga habilitado ignore_result .

    Habilitar esta opción obligará al trabajador a omitir los estados de actualización.

  2. Asegúrese de que la configuración CELERY_IGNORE_RESULT no esté habilitada.

  3. Asegúrate de que no tienes ningún trabajador antiguo aún en funcionamiento.

    Es fácil iniciar varios trabajadores por accidente, así que asegúrese de que el trabajador anterior esté correctamente cerrado antes de comenzar uno nuevo.

    Un antiguo trabajador que no está configurado con el resultado esperado puede estar ejecutándose y está secuestrando las tareas.

    El argumento –pidfile se puede establecer en una ruta absoluta para asegurarse de que esto no suceda.

  4. Asegúrese de que el cliente esté configurado con el backend correcto.

Si, por algún motivo, el cliente está configurado para usar un backend diferente al del trabajador, no podrá recibir el resultado, por lo tanto, asegúrese de que el backend sea correcto inspeccionándolo:

>>> result = task.delay(…) >>> print(result.backend)

Soy bastante nuevo en apio y django en general, así que disculpe mi falta de conocimiento. Estoy tratando de realizar una prueba para hacer algunos cálculos y esperar a que la prueba termine para poder asegurarme de que se realice para las respuestas correctas.

Esto es lo que tengo:

En app / tests.py

from tasks import * c = calculate.apply_async(args=[1]) # wait until the task is done while not calculate.AsyncResult(c.id).status == "SUCCESS": print c.state pass

en aplicación / tareas.py

from celery import shared_task @shared_task def calculate(proj_id): #some calculations followed by a save of the object

El estado nunca cambia de pendiente aunque en el registro de apio dice que la tarea se completó con éxito

[2014-06-10 17:55:11,417: INFO/MainProcess] Received task: app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac] [2014-06-10 17:55:11,505: INFO/MainProcess] Task app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac] succeeded in 0.0864518239978s: None

También he puesto CELERY_IGNORE_RESULT = Falso en mainapp / settings.py, pero esto no parece hacer nada.


Por lo tanto, su configuración es incorrecta. :) También es necesario configurar un corredor para que funcione el apio.

En primer lugar, djcelery está en desuso, todo está incluido en el celery para que funcione con django .

En segundo lugar, no configure todo el contenido para que sea aceptado, puede ser un riesgo de seguridad potencial. Utilice pickle solo en caso de que el simple json no sea suficiente (digamos que pasa funciones u objetos como argumentos a tareas o regresa de tareas)

Entonces, supongo que solo estás probando apio, por eso intentas usar el backend de la base de datos, lo cual está bien, pero para uso en producción recomendaría usar RabbitMQ.

En cualquier caso, inténtalo con esos ajustes:

BROKER_URL = ''django://'' INSTALLED_APPS = ( ... ''kombu.transport.django'', ... ) CELERY_RESULT_BACKEND = ''db+scheme://user:password@host:port/dbname'' CELERY_ACCEPT_CONTENT = [''json''] CELERY_TASK_SERIALIZER = ''json'' CELERY_RESULT_SERIALIZER = ''json'' CELERY_IGNORE_RESULT = False # this is less important

luego ejecuta python manage.py syncdb

Solo para hacerle saber, no he usado la base de datos como intermediario o como resultado de backend, por lo tanto, la configuración podría estar incompleta, o incluso ser incorrecta, pero inténtelo de todos modos.

más configuración de CELERY_RESULT_BACKEND para ejemplos de bases de datos

En caso de que desee configurar RabbitMQ como intermediario de intermediario, lo recomendaría y estoy seguro de que funcionará:

Si está en Ubuntu ejecutar:

sudo apt-get install rabbitmq-server sudo rabbitmqctl add_user <username> <password> sudo rabbitmqctl add_vhost <vhost, use project name for example> sudo rabbitmqctl set_permissions -p <vhost> <username"> ".*" ".*" ".*"

Luego configura el apio en settings.py :

BROKER_URL = ''amqp://<user>:<password>@localhost:5672/<vhost>'' CELERY_TIMEZONE = TIME_ZONE CELERY_RESULT_BACKEND = ''amqp'' # thats where celery will store scheduled tasks in case you restart the broker: CELERYD_STATE_DB = "/full/path/data/celery_worker_state" CELERY_ACCEPT_CONTENT = [''json''] CELERY_TASK_SERIALIZER = ''json'' CELERY_RESULT_SERIALIZER = ''json''

Déjame saber como va.


Si está usando django-celery antiguo y RabbitMQ como resultado backend, entonces estas configuraciones pueden ayudar:

# Mostly, all settings are the same as in other answers CELERY_RESULT_BACKEND = ''rpc://'' CELERY_ACCEPT_CONTENT = [''json''] CELERY_TASK_SERIALIZER = ''json'' CELERY_RESULT_SERIALIZER = ''json'' CELERY_IGNORE_RESULT = False # This line is what I needed CELERY_TRACK_STARTED = True