Python 芹菜元';t在django 1.11和芹菜4.0.0或4.1.0中发现共享的_任务
我在我的项目中有这样一个布局:(正如文档中所说的那样) 在init.py中:Python 芹菜元';t在django 1.11和芹菜4.0.0或4.1.0中发现共享的_任务,python,django,celery,django-celery,Python,Django,Celery,Django Celery,我在我的项目中有这样一个布局:(正如文档中所说的那样) 在init.py中: from __future__ import absolute_import, unicode_literals # This will make sure the app is always imported when # Django starts so that shared_task will use this app. from .celery import app as celery_app __all
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ['celery_app']
在芹菜中:
from __future__ import absolute_import, unicode_literals
import os
import environ
from celery import Celery
env = environ.Env()
environ.Env.read_env()
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('C_FORCE_ROOT', 'true')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')
app = Celery('backend', backend='rpc://', broker=env('broker'))
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self))
我在tasks.py模块中有几个共享的_任务,如下所示:
@shared_task
def recalc_ranking_music():
musics = musics_models.Music.objects.all().order_by("-num_points")
for music, rank in enumerate(musics):
music.ranking = rank + 1
music.save()
celery -A demoproject worker --loglevel=info
当我用命令启动芹菜时:芹菜-后端工作者-l信息
如您所见,我在tasks.py模块中的任务不会被芹菜进程读取,但芹菜.py文件夹中的任务会被读取
奇怪的是,我在另一个项目中有相同的精确布局,而且效果很好
我有两天的时间,这真的需要一些时间,有什么帮助吗
更新:(来自评论)“musics”是一款django应用程序,因此它有一个\uuuu init\uuuuuuuuuuuuuupy
文件
我还尝试将应用程序名称传递给芹菜实例上的自动发现方法,但没有任何运气
如果我在app.autodiscover\u tasks(force=True)中设置,它会抛出一个错误:
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
您的
music
目录是否有\uuuu init\uuuu.py
另外,请尝试显式指定包名称:
app.autodiscover_任务(['music']))
芹菜文档您的问题可能与运行芹菜的范围有关(例如:虚拟环境) 例如,当我像这样经营芹菜时:
@shared_task
def recalc_ranking_music():
musics = musics_models.Music.objects.all().order_by("-num_points")
for music, rank in enumerate(musics):
music.ranking = rank + 1
music.save()
celery -A demoproject worker --loglevel=info
它只输出一个任务(我的演示应用程序中唯一的一个):
但当我从virtualenv运行它时,结果是:
[tasks]
. core.tasks.demo
. myapp.tasks.demo_task
看到了吗?由于环境原因,它发现了一个新的应用程序。我找到了一个解决方案,我只需将模块(Django应用程序)导入到芹菜.py文件中,它就会读取所有任务
但是,这不是芹菜文档中描述的行为是的,它有init.py,这是一个django应用程序。此外,我还尝试过不走运地传递应用程序名称。如果你在
已安装的应用程序中错过了音乐
?是的,每个应用程序都在已安装的应用程序
设置中。我没有使用virtualenv,我使用了一个漫游框,python可执行文件以及pip库都在系统路径中,芹菜可执行性也有同样的问题,在不同的环境中发现不同的任务。结果我忘了在env中安装一些没有发现新任务的新依赖项。当import[未安装的东西]
正在破坏东西时,芹菜似乎在自动任务发现中悄无声息地失败了。