Python django redis芹菜和芹菜节拍的正确设置

Python django redis芹菜和芹菜节拍的正确设置,python,django,celery,celerybeat,Python,Django,Celery,Celerybeat,我一直在尝试设置django+Celly+redis+Celly_beats,但这给我带来了麻烦。文档非常简单,但是当我运行django服务器、redis、celery和celery beats时,没有任何内容被打印或记录(我所有的测试任务都会记录一些东西) 这是我的文件夹结构: - aenima - aenima - __init__.py - celery.py - criptoball - tasks.py 芹菜.py看起来像这样: from __future_

我一直在尝试设置django+Celly+redis+Celly_beats,但这给我带来了麻烦。文档非常简单,但是当我运行django服务器、redis、celery和celery beats时,没有任何内容被打印或记录(我所有的测试任务都会记录一些东西)

这是我的文件夹结构:

- aenima 
 - aenima
   - __init__.py
   - celery.py

 - criptoball
   - tasks.py
芹菜.py看起来像这样:

from __future__ import absolute_import, unicode_literals
import os
from django.conf import settings
from celery import Celery


# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'aenima.settings')

app = Celery("criptoball")
app.conf.broker_url = 'redis://localhost:6379/0'

# Using a string here means the worker doesn'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(lambda: settings.INSTALLED_APPS)
app.conf.timezone = 'UTC'

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

app.conf.beat_schedule = {
    'test-every-30-seconds': {
        'task': 'tasks.test_celery',
        'schedule': 30.0,
        'args': (16, 16)
    }, }
from __future__ import absolute_import, unicode_literals
from datetime import datetime, timedelta
from celery import shared_task
import logging

from django_celery_beat.models import PeriodicTask, IntervalSchedule

cada_10_seg = IntervalSchedule.objects.create(every=10, period=IntervalSchedule.SECONDS)

test_celery_periodic = PeriodicTask.objects.create(interval=cada_10_seg, name='test_celery', task='criptoball.tasks.test_celery',
expires=datetime.utcnow()+timedelta(seconds=30))

@shared_task
def test_celery(x, y):
    logger = logging.getLogger("AENIMA")
    print("EUREKA")
    logger.debug("EUREKA")
tasks.py如下所示:

from __future__ import absolute_import, unicode_literals
import os
from django.conf import settings
from celery import Celery


# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'aenima.settings')

app = Celery("criptoball")
app.conf.broker_url = 'redis://localhost:6379/0'

# Using a string here means the worker doesn'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(lambda: settings.INSTALLED_APPS)
app.conf.timezone = 'UTC'

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

app.conf.beat_schedule = {
    'test-every-30-seconds': {
        'task': 'tasks.test_celery',
        'schedule': 30.0,
        'args': (16, 16)
    }, }
from __future__ import absolute_import, unicode_literals
from datetime import datetime, timedelta
from celery import shared_task
import logging

from django_celery_beat.models import PeriodicTask, IntervalSchedule

cada_10_seg = IntervalSchedule.objects.create(every=10, period=IntervalSchedule.SECONDS)

test_celery_periodic = PeriodicTask.objects.create(interval=cada_10_seg, name='test_celery', task='criptoball.tasks.test_celery',
expires=datetime.utcnow()+timedelta(seconds=30))

@shared_task
def test_celery(x, y):
    logger = logging.getLogger("AENIMA")
    print("EUREKA")
    logger.debug("EUREKA")
这是文件

不知道我错过了什么。当我跑的时候

芹菜-aenima beat-l调试--调度程序django_Cellery_beat。调度程序:DatabaseScheduler

芹菜-一个aenima工人-l调试

redis cli ping 庞

django runserver和redis server,我没有打印任何内容

设置.py

CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = TIME_ZONE
CELERY_IMPORTS = ('criptoball.tasks',)
到目前为止,我还没有找到任何关于这个话题的权威答案

我想解决这一切,这个错误可能只是众多错误中的一个。非常感谢你的帮助

编辑:

添加了redis的设置,以不同的方式声明了任务,并提高了调试级别。现在的错误是:

收到类型为“tasks.test\u芹菜”的未注册任务。信息 已被忽略和丢弃

您是否记得导入包含此任务的模块?或许 你在使用相对导入? 关键错误:u'aenima.scriptoball.tasks.test_芹菜'

我相信芹菜的文件很差

编辑2
在尝试了所有操作之后,当我将所有任务放在同一个芹菜.py文件中时,它就成功了。@shared_任务不起作用,必须使用@app.task。

有一件事你应该解决,使用:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

告诉芹菜,如果你使用的是芹菜3.x,你希望它发现哪些应用程序的任务。

我以前遇到过这些问题。这不是你的密码。这通常是环境问题。 您应该在
virtualenv
下运行所有内容,添加一个
requirements.txt
文件,其中包含特定的软件包版本

<关于>代码>芹菜4 .x<代码>和<代码> django 1 .x<代码>,所以你应该考虑你使用的包。

本教程将详细解释如何使用芹菜构建
virtualenv

如果您能告诉我您的软件包版本,我可能会尝试以不同的方式提供帮助

编辑:

我想这和你经营芹菜的方式有关。如果我们解决了第一个问题,请尝试使用以下方法:

celery -A aenima.celery:app beat -l debug --scheduler django_celery_beat.schedulers:DatabaseScheduler

您遇到的最新错误与模块发现有关。
首先尝试一下。

使用
virtualenv
这样做会很方便

首先,就像@Gal说的,你需要确保你有
芹菜4.x

您可以通过
pip
安装此软件:

安装芹菜

当然,您也可以安装
4.x
版本,将其添加到
requirements.txt
中,如下所示:

芹菜==4.1.0

或更高版本(如果将来可用)

然后,您可以使用以下方式重新安装所有软件包:

  • pip安装-r requirements.txt
这将确保你有一定的芹菜包安装

现在是芹菜部分,虽然你的代码可能没有错,但我将以某种方式写下我是如何让芹菜应用程序工作的

__初始值u uuuuuuuuuuuuy.py:

芹菜:

正如我在代码中所解释的,芹菜4.x中内置的常规
taskregistry
不起作用,因此我使用了演示taskregistry。 当然,您也可以不使用类来生成任务,但我更喜欢使用类

settings.py:

收到类型为“tasks.test\u芹菜”的未注册任务。该消息已被忽略和丢弃

您是否记得导入包含此任务的模块?或者您使用的是相对导入

可能您的任务路径不正确,应该是:

app.conf.beat_schedule = {
    'test-every-30-seconds': {
        'task': 'criptoball.tasks.test_celery',
        'schedule': 30.0,
        'args': (16, 16)
    }, 
}

tasks.test\u芹菜
应为完整路径:
scriptoball.tasks.test\u芹菜

是否有芹菜工人在运行?例如,从命令行,
芹菜工人-A
。东西应该在你开始的终端上打印出来。@Chris更新了答案,增加了一笔赏金。看起来像是
芹菜-aenima beat芹菜-aenima worker-l info
可能是转录/格式错误。你是想把这些放在两行上吗?@sytech是的。谢谢你的评论,更正了。我建议你使用django-q。不是你问题的答案,但我能感觉到你的痛苦。我用了一段时间芹菜,然后就放弃了。问题太多了,当你解决一个问题时,你就有另一个问题需要调试。使用django-q要容易得多。好luckI我用的是虚拟电视。我有django 1.10和芹菜4.1。我应该升级django吗?你应该将芹菜降级到3.x。在我的安装中我做到了这一点,它工作得非常好。我可以补充一点,在文档中,它写为
Celery 4.0,支持Django 1.8和更新版本。对于Django 1.8之前的版本,请使用芹菜3.1。
?因此,4.x应该能够与django 1.10一起使用,如果有什么建议的话,我建议将django升级到更高版本:)你说得对,但事实是它仍然存在问题。我想我们都同意问题出在版本上。如果是我,我宁愿降低芹菜的等级,也不愿升级django。如果你的项目很大,升级django可能会让人头疼……是的,django在升级时会给你带来很多麻烦,但是django的版本最近增长得相当快,所以最终无论哪种方式都需要升级,但是是的。我同意这也可能是版本之间的差异。:)谢谢你的回答。。。更改了我的代码,你认为它必须打印这样的东西吗?我如何知道测试是否正在执行?@alejos如果你想在控制台中看到一些东西,那么你首先需要作为守护进程
redis服务器运行redis——daemonize yes
,然后芹菜工人不作为守护进程
芹菜-A ae运行
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import requests

from django.conf import settings
from django.http import HttpResponse

from celery.task import Task
from celery.five import python_2_unicode_compatible
from celery import Celery
app = Celery()


@python_2_unicode_compatible
class Update(Task):
    name = 'tasks.update'

    def run(self, *args, **kwargs):
        # Run the task you want to do.

""" For me the regular TaskRegistry didn't work to register classes, 
so I found this handy TaskRegistry demo and made use of it to 
register tasks as classes."""
class TaskRegistry(Task):

    def NotRegistered_str(self):
        self.assertTrue(repr(TaskRegistry.NotRegistered('tasks.add')))

    def assertRegisterUnregisterCls(self, r, task):
        with self.assertRaises(r.NotRegistered):
            r.unregister(task)
        r.register(task)
        self.assertIn(task.name, r)

    def assertRegisterUnregisterFunc(self, r, task, task_name):
        with self.assertRaises(r.NotRegistered):
            r.unregister(task_name)
        r.register(task, task_name)
        self.assertIn(task_name, r)

    def task_registry(self):
        r = TaskRegistry()
        self.assertIsInstance(r, dict, 'TaskRegistry is mapping')

        self.assertRegisterUnregisterCls(r, Update)

        r.register(Update)
        r.unregister(Update.name)
        self.assertNotIn(Update, r)
        r.register(Update)

        tasks = dict(r)
        self.assertIsInstance(
            tasks.get(Update.name), Update)

        self.assertIsInstance(
            r[Update.name], Update)

        r.unregister(Update)
        self.assertNotIn(Update.name, r)

        self.assertTrue(Update().run())

    def compat(self):
        r = TaskRegistry()
        r.regular()
        r.periodic()
# Broker settings for redis
CELERY_BROKER_HOST = '<YOUR_HOST>'
CELERY_BROKER_PORT = 6379
CELERY_BROKER_URL = 'redis://'
CELERY_DEFAULT_QUEUE = 'default'

# Celery routes
CELERY_IMPORTS = (
    'PATH.TO.tasks' # The path to your tasks.py
)

CELERY_DATABASE_URL = {
    'default': '<CELERY_DATABASE>', # You can also use your already being used database here
}

INSTALLED_APPS = [
    ...
    'PATH.TO.TASKS' # But exclude the tasks.py from this path
]

LOGGING = {
    ...
    'loggers': {
        'celery': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': True,
        },
    }
}
from celery import Celery
app = Celery()

@app.task
def test_celery(x, y):
    logger = logging.getLogger("AENIMA")
    print("EUREKA")
    logger.debug("EUREKA")
app.conf.beat_schedule = {
    'test-every-30-seconds': {
        'task': 'criptoball.tasks.test_celery',
        'schedule': 30.0,
        'args': (16, 16)
    }, 
}