【问题标题】:How to periodically schedule a task django celery如何定期安排任务 django celery
【发布时间】:2015-08-26 01:20:46
【问题描述】:
# 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,但我仍然对如何使用它感到困惑。

【问题讨论】:

  • 你离这里很远。首先,与其从 randadd 返回值,不如将其存储在某个数据存储中。然后,您的视图应加载此值以显示它。 Beat 是 Celery 内置的定期触发任务的工具。
  • 我明白了,你能告诉我如何或建议一个链接吗?

标签: python django celery


【解决方案1】:

这是一个使用 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可以作为消息队列使用)
  • 经营芹菜工人
  • 运行 celery beat 实例

【讨论】:

  • 有没有等价的方式用rabbitmq存储数据?例如,您使用 redis.StrictRedis() 将 randint(0,9) 存储在“my_number”中。
  • 不,RabbitMQ 不提供存储。使用 Redis 的替代方案是数据库,例如 PostgreSQL。在 Django 世界中,您将创建一个模型来读取和写入数据库。
  • 感谢您的帮助。多亏了你,我才能解决我的问题。
【解决方案2】:

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

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)
    },
}

【讨论】:

  • 我已经尝试过了,但它不起作用。我认为我引用的文档只是每 ​​30 秒调用一次函数,但我希望存储在“添加”中的数据定期更新。
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 2020-04-05
  • 2014-02-23
  • 2019-04-03
  • 2017-01-06
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多