Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜元';t在django 1.11和芹菜4.0.0或4.1.0中发现共享的_任务_Python_Django_Celery_Django Celery - Fatal编程技术网

Python 芹菜元';t在django 1.11和芹菜4.0.0或4.1.0中发现共享的_任务

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

我在我的项目中有这样一个布局:(正如文档中所说的那样)

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__ = ['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[未安装的东西]
正在破坏东西时,芹菜似乎在自动任务发现中悄无声息地失败了。