如何运行一组celery任务?应用尚未加载
How to run a group of celery tasks? Apps aren't loaded yet
例如,我有两个任务:a
和 b
。
我需要 运行 它们并行。我创建了一组任务并尝试 运行 它。但是我得到错误
proj/app/tasks.py
@app.task
def a():
pass
@app.task
def b():
pass
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
应用程序 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
确保您执行以下操作:
重置您的服务器
重置您的 celery 工作池
如果这不能解决问题,请告诉我。
此外,您不需要 from __future__ import absolute_import, unicode_literals
。这仅用于 python2 兼容性。
更新
我刚刚意识到您正在将它们导入到您的芹菜文件中(不确定您是否可以这样做)。尝试删除任务导入,然后尝试在 django shell (运行 ./manage.py shell
) 中 运行ning 任务。
将您的 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()
这里有两个问题。
首先,您不应该导入其他任务 - 这就是 app.autodiscover_tasks()
的用途。删除行 from app.tasks import a, b
其次,你不应该打电话给run_group
。这是当你想要 运行 组中的任务时使用的。
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()
例如,我有两个任务:a
和 b
。
我需要 运行 它们并行。我创建了一组任务并尝试 运行 它。但是我得到错误
proj/app/tasks.py
@app.task
def a():
pass
@app.task
def b():
pass
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
应用程序 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
确保您执行以下操作:
重置您的服务器
重置您的 celery 工作池
如果这不能解决问题,请告诉我。
此外,您不需要 from __future__ import absolute_import, unicode_literals
。这仅用于 python2 兼容性。
更新
我刚刚意识到您正在将它们导入到您的芹菜文件中(不确定您是否可以这样做)。尝试删除任务导入,然后尝试在 django shell (运行 ./manage.py shell
) 中 运行ning 任务。
将您的 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()
这里有两个问题。
首先,您不应该导入其他任务 - 这就是 app.autodiscover_tasks()
的用途。删除行 from app.tasks import a, b
其次,你不应该打电话给run_group
。这是当你想要 运行 组中的任务时使用的。
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()