【发布时间】:2018-07-13 21:50:45
【问题描述】:
我一直在尝试设置 django + celery + redis + celery_beats,但这给我带来了麻烦。文档非常简单,但是当我运行 django 服务器、redis、celery 和 celery beats 时,没有任何东西被打印或记录(我所有的测试任务都会记录一些东西)。
这是我的文件夹结构:
- aenima
- aenima
- __init__.py
- celery.py
- criptoball
- tasks.py
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)
}, }
task.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")
这是django_celery_beat 文档
不知道我错过了什么。当我跑步时
celery -A aenima beat -l debug --scheduler django_celery_beat.scheduler:DatabaseScheduler
celery -A aenima worker -l 调试
redis-cli ping 乒乓
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',)
到目前为止,还没有找到任何关于这个话题的权威答案。
我想解决这一切,这个错误可能只是众多错误之一。非常感谢您的帮助!
编辑:
为 redis 添加了设置,以不同的方式声明了任务并提高了调试级别。现在的错误是:
收到 u'tasks.test_celery' 类型的未注册任务。讯息 已被忽略并丢弃。
您还记得导入包含此任务的模块吗?或许 您正在使用相对进口? KeyError: u'aenima.criptoball.tasks.test_celery'
我认为 Celery 的文档很差。
编辑 2 在尝试了一切之后,当我将所有任务放在同一个 celery.py 文件中时,它就起作用了。 @shared_task 不起作用,必须使用 @app.task 。
【问题讨论】:
-
你有一个芹菜工人在跑步吗?例如。从命令行,
celery worker -A <your_module_name>。东西应该打印在你开始的终端上。 -
@Chris 更新了答案,增加了赏金。
-
看起来
celery -A aenima beat celery -A aenima worker -l info可能是转录/格式错误。你的意思是把它们放在两行吗? -
@sytech 是的。感谢您的评论,已更正。
-
我建议你使用 django-q。不是你的问题的答案,但我能感觉到你的痛苦。我用了一段时间芹菜,然后我放弃了。问题太多,当你解决了一个问题时,你还有另一个问题要调试。使用 django-q 要容易得多。祝你好运
标签: python django celery celerybeat