Por ejemplo, tengo dos tareas: a y b. Necesito ejecutarlos en paralelo. Creo un grupo de tareas e intento ejecutarlo. Pero me sale un error

proj / app / task.py

@app.task
def a():
    pass

@app.task
def b():
    pass

django.core.exceptions.AppRegistryNotReady: las aplicaciones aún no están cargadas.

La aplicación app se registra en INSTALLED_APPS y se completa toda la migración

proj / proj / __ init__.py

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ('celery_app',)

proj / proj / celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))


from celery import group
from app.tasks import a, b

run_group = group(a.s(), b.s())
run_group()

Traceback

File "/home/m0nte-cr1st0/test_projects/proj/proj/__init__.py", line 5, in <module>
    from .celery import app as celery_app
File "/home/m0nte-cr1st0/test_projects/proj/proj/celery.py", line 26, in <module>
    from app.tasks import a, b
File "/home/m0nte-cr1st0/test_projects/proj/app/tasks.py", line 14, in <module>
    from .models import Link, Prediction, PredictionBK
File "/home/m0nte-cr1st0/test_projects/proj/app/models.py", line 2, in <module>
    from django.contrib.auth.models import AbstractUser
0
unknown 10 oct. 2019 a las 10:50

4 respuestas

La mejor respuesta

proj / proj / celery.py

import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')
app.config_from_object('django.conf:settings')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

proj / proj / settings.py

REDIS_HOST = 'localhost'
REDIS_PORT = '6379'
BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'

proj / proj / __ init__.py

from .celery import app as celery_app

proj / app / task.py

from celery import group


@app.task
def a():
    pass


@app.task
def b():
    pass


run_group = group(a.s(), b.s())
run_group()
1
Дмитрий Дмитрук 10 oct. 2019 a las 08:40

Cambie su proj/proj/celery.py a esto:


from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

import django
django.setup()

from celery import group
from app.tasks import a, b

run_group = group(a.s(), b.s())
run_group()
-1
Aref mousakhani 10 oct. 2019 a las 08:06

Asegúrese de hacer lo siguiente:

  • reinicia tu servidor

  • restablecer su grupo de trabajadores de apio

Si eso no soluciona el problema, hágamelo saber.

Además, no necesita el from __future__ import absolute_import, unicode_literals. Esto solo se usa para la compatibilidad con python2.

Actualizar

Me acabo de dar cuenta de que los estás importando a tu archivo de apio (no estoy seguro si puedes hacer esto). Intente eliminar la importación de la tarea, luego intente ejecutar la tarea en un shell de django (ejecute ./manage.py shell).

1
Reinstate Monica 10 oct. 2019 a las 08:03

Hay dos problemas aquí.

En primer lugar, no deberías importar las otras tareas, para eso sirve app.autodiscover_tasks(). Elimine la línea from app.tasks import a, b

En segundo lugar, no debe estar llamando run_group. Eso es para cuando quieres ejecutar las tareas en el grupo.

1
Daniel Roseman 10 oct. 2019 a las 08:08
58317948