如何运行一组芹菜任务?应用尚未加载

时间:2019-10-10 07:50:35

标签: python django celery

例如,我有两个任务:ab。 我需要并行运行它们。我创建了一组任务并尝试运行它。但是我得到了错误

proj / app / tasks.py

@app.task
def a():
    pass

@app.task
def b():
    pass
  

django.core.exceptions.AppRegistryNotReady:应用尚未加载。

应用app已在INSTALLED_APPS中注册,并且所有迁移都已完成

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()

跟踪

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

4 个答案:

答案 0 :(得分:1)

确保执行以下操作:

  • 重置服务器

  • 重置您的芹菜工作者池

如果仍不能解决问题,请告诉我。

此外,您不需要from __future__ import absolute_import, unicode_literals。这仅用于python2兼容性。

更新

我刚刚意识到您正在将它们导入到您的celery文件中(不确定是否可以这样做)。尝试删除任务导入,然后尝试在Django shell中运行任务(运行./manage.py shell)。

答案 1 :(得分:1)

这里有两个问题。

首先,您不应该导入其他任务-这就是app.autodiscover_tasks()的目的。删除行from app.tasks import a, b

第二,您不应打电话 run_group。这是当您要运行组中的任务时使用的。

答案 2 :(得分:0)

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 / tasks.py

from celery import group


@app.task
def a():
    pass


@app.task
def b():
    pass


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

答案 3 :(得分:-1)

将您的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')
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()