Django celery beat 任务不起作用
Posted
技术标签:
【中文标题】Django celery beat 任务不起作用【英文标题】:Django celery beat task not working 【发布时间】:2018-09-17 01:06:43 【问题描述】:celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TwitterApiProxy.settings')
app = Celery('TwitterApiProxy')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# Calls test('hello') every 10 seconds.
sender.add_periodic_task(10.0, hello_test.s('hello'), name='add every 10')
@app.task
def hello_test(arg):
print(arg)
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 = 'America/Los_Angeles'
我想每 10 秒打印一次“hello”。所以在我的终端上运行celery -A TwitterApiProxy beat
,我看到如下:
LocalTime -> 2018-04-06 23:27:09
Configuration ->
. broker -> redis://localhost:6379//
. loader -> celery.loaders.app.AppLoader
. scheduler -> celery.beat.PersistentScheduler
. db -> celerybeat-schedule
. logfile -> [stderr]@%WARNING
. maxinterval -> 5.00 minutes (300s)
它没有打印与我安排的任务相关的任何内容。我哪里做错了?
【问题讨论】:
我的配置有点不同,但在回答之前,我对两件事感到好奇。 1:你的函数“setup_periodic_tasks”,能不能放个打印语句,看看是不是真的被调用了? 2:假设您正在为应用程序运行 celery worker。这个假设正确吗? 【参考方案1】:您的设置没有问题。
在两个单独的 cmd 窗口中启动你的 worker 和 celery beat
celery -A TwitterApiProxy worker -l info
celery -A TwitterApiProxy beat -l info
如果你使用的是 Celery 4.0+,你必须先安装eventlet,然后像这样启动你的worker:
celery -A TwitterApiProxy worker -l info -P eventlet
任务管理后端
如果你想要一个任务管理后端,你可以安装和使用django-celery
【讨论】:
启动celery 3.1,直接支持Django。所以不需要添加像 django-celery 这样的额外库 @LokeshCherukuri 我在我的应用程序中运行您的代码。对我来说工作得很好。请参阅我编辑的答案。让我知道它是否适合您。 你拯救了我的一天,谢谢!!!我整天都在尝试beat
,但在单独的窗口中没有worker
(facepalm)
为什么 celery 4.0+ 需要 eventlet?以上是关于Django celery beat 任务不起作用的主要内容,如果未能解决你的问题,请参考以下文章
python测试开发django-197.django-celery-beat 定时任务
尝试使用 celery beat 在 django 中调度一个函数但给出错误
django+redis+celery(beat)发布定时任务
在使用 django_celery_beat 设置的 Django 视图中使用 Celery 定期任务输出,并使用 Redis 设置缓存