如何定期安排任务django celery

How to periodically schedule a task django celery

# In tasks.py file
from __future__ import absolute_import

from celery import shared_task

@shared_task
def randadd(x):
    y = randint(0,9)
    return x + y

# In views.py 
    context = {
        'add': tasks.randadd(5)
    }
def home(request):
    global context
    return render(request, "home.html", context)

# In home.html
<h1>{{ add }}</h1>

在 home.html 中,我看到了 5 + 的结果(一个随机整数)。我如何重新计算 add 的结果,使其值每 30 分钟更新一次?

我找到了这个来源:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html,但我仍然对如何使用它感到困惑。

根据您引用的文档,看起来这是一种方式:

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    'context': {
        'task': 'randadd',
        'schedule': crontab(minute=30),
        'args': 5
        # or if that doesn't work try:
        #'args':(5)
    },
}

这是另一个:

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    'context': {
        'task': 'tasks.add',
        'schedule': timedelta(minutes=30),
        'args': 5
        #but the last line still might be:
        #'args':(5)
    },
}

这是一个使用 Redis 作为数据存储的 shell 实现。它假定已安装 Redis 并且 运行 在具有默认设置的本地计算机上。

# tasks.py
import redis
from celery import shared_task

@shared_task
def update_number():
    r = redis.StrictRedis()
    r.set('my_number', randint(0,9))


# views.py
import redis

def home(request):
    r = redis.StrictRedis()
    context = {
        'add': r.get('my_number')
    }
    return render(request, 'home.html', context)


# settings.py
from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    'context': {
        'task': 'tasks.update_number',
        'schedule': crontab(minute=30),
    }
}

请务必检查以下 celery 文档:

  • 配置消息队列(Redis可以作为消息队列使用)
  • 运行 芹菜工人
  • 运行一个芹菜节拍实例