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

Ale*_*lla 12 python django celery celerybeat

我一直试图设置django + celery + redis + celery_beats,但它给了我麻烦.文档非常简单,但是当我运行django服务器,redis,芹菜和芹菜节拍时,没有任何内容被打印或记录(我所有的测试任务都会记录它的东西).

这是我的文件夹结构:

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

 - criptoball
   - tasks.py
Run Code Online (Sandbox Code Playgroud)

celery.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)
    }, }
Run Code Online (Sandbox Code Playgroud)

和tasks.py看起来像这样:

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")
Run Code Online (Sandbox Code Playgroud)

这是django_celery_beat文档

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

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

celery -A aenima worker -l debug

redis-cli ping PONG

django runserver和redis服务器,我什么都没打印.

settings.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',)
Run Code Online (Sandbox Code Playgroud)

到目前为止,还没有在SO中找到任何关于此主题的认可答案.

我想解决这一切,这个错误可能只是其中之一.非常感谢你的帮助!

编辑:

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

收到类型为u'tasks.test_celery'的未注册任务.该消息已被忽略并被丢弃.

你还记得导入包含这个任务的模块吗?或者你可能正在使用相对进口?KeyError:u'aenima.criptoball.tasks.test_celery'

我相信Celery的文档很差.

编辑2 尝试所有内容后,当我将所有任务放在同一个celery.py文件中时,它就可以工作了.@shared_task不起作用,不得不使用@ app.task.

Gal*_*man 10

我之前有过这些问题.这不是你的代码.这通常是环境问题.您应该运行所有内容virtualenv,添加requirements.txt具有特定包版本的文件.

有一个关于celery 4.x和的已知问题django 1.x,所以你应该考虑你正在使用的包.

教程将详细说明如何virtualenv使用芹菜构建.

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

编辑:

我认为这与你经营芹菜的方式有关.如果我们修复了第一个问题,请尝试使用此方法:

celery -A aenima.celery:app beat -l debug --scheduler django_celery_beat.schedulers:DatabaseScheduler
Run Code Online (Sandbox Code Playgroud)

要么

celery -A aenima.aenima.celery:app beat -l debug --scheduler django_celery_beat.schedulers:DatabaseScheduler
Run Code Online (Sandbox Code Playgroud)

您获得的最新错误与模块发现有关.先试试吧.


uni*_*xia 2

您应该解决一件事,使用:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
Run Code Online (Sandbox Code Playgroud)

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