利用Celery实现定时任务

  Celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。在之前的文章Python之celery的简介与使用中,笔者简单介绍了celery以及celery的使用。本文将会将会如何利用celery来实现定时任务。
  定时任务,在我们平时的工作中并不少见,比如定时备份数据库,清理日志,以及对数据定时做统计等。
  本文将会结合两个定时任务来进行讲解,这两个定时任务为:

  • 每10秒做加法
  • 每1分钟告诉时间

  整个项目的演示代码很简单,如下:
项目代码
  celeryconfig.py文件为celery的相关配置,代码如下:

BROKER_URL = 'redis://localhost'    # 使用Redis作为消息代理

CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'  # 把任务结果存在了Redis

CELERY_TASK_SERIALIZER = 'msgpack'  # 任务序列化和反序列化使用msgpack方案

CELERY_RESULT_SERIALIZER = 'json'   # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON

CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24   # 任务过期时间,不建议直接写86400,应该让这样的magic数字表述更明显

CELERY_ACCEPT_CONTENT = ['json', 'msgpack']     # 指定接受的内容类型

CELERYD_CONCURRENCY = 10    # 并发worker数

  tasks.py 为具体的任务情况,这里只配置了上述两个任务,代码如下:

from proj.app_test import app
import datetime
from random import randint


@app.task
def add(x, y):
    a = randint(x, y)
    b = randint(x, y)
    return "%s + %s = %s" % (a, b, a+b)


@app.task
def time_teller():
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

  app_test.py中是程序的运行配置以及定时任务的设置,代码如下:

from celery import Celery
from celery.schedules import crontab

app = Celery('proj', include=['proj.tasks'])
app.config_from_object('proj.celeryconfig')

# 定时任务
app.conf.beat_schedule = {
    "each10s_task": {
        "task": "proj.tasks.add",
        "schedule": 10,
        "args": (0, 100)
    },
    "each1m_task": {
        "task": "proj.tasks.time_teller",
        "schedule": crontab(minute="*/1")
    }
}

从上述的代码中,我们可以看出,celery的定时任务实现方式应该借助了Linux中Crontab的实现机制。在具体的配置中,需要指定任务的名称(比如:each10s_task),任务的实现函数(比如:proj.tasks.add)以及定时时间和函数参数(非必须)。关于定时的schedule模式,可以参考网址:https://docs.celeryproject.org/en/stable/userguide/periodic-tasks.html
  接下来,我们来模拟该定时任务的运行。
  首先,需要启动消息队列,这里选择Redis。接着,运行任务调度的命令,如下:

celery beat -A proj.app_test

输出如下:

接着运行celery的定时任务,输出结果如下:
运行结果
  如果我们想在网页中可视化地查看celery的实时监控情况,可以再输入命令(事先安装flower):

celery -A proj.app_test flower

在网页中输入localhost:5555,可以看到worker的运行情况,如下:
flower监控页面
  本文简单讲述了如何利用celery来实现定时任务,其实有很多实现定时任务的办法,比如crontab等等。笔者主要是为了研究celery,后续还会再写这方面的文章,欢迎大家关注~

Django 是一个非常流行的 web 框架,而 Celery 是一个 Python 分布式任务队列,它可以让我们方便地在 Django 中实现定时任务。下面是一个简单的例子: 第一步是安装和配置 Celery。可以使用 pip 安装: ``` pip install celery ``` 然后在 Django 的 settings.py 文件中添加以下配置: ``` CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' CELERY_TIMEZONE = 'Asia/Shanghai' ``` 这里假设我们使用 Redis 作为消息代理和结果存储。 第二步是创建一个 Celery 应用。在 Django 的项目目录下创建一个 celery.py 文件,添加以下内容: ```python import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') app = Celery('your_project') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() ``` 这里的 your_project 是你的 Django 项目名称。 第三步是定义任务。在 Django 的某个 app 下创建一个 tasks.py 文件,添加以下内容: ```python from celery import shared_task from datetime import datetime @shared_task def print_time(): print(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) ``` 这里定义了一个名为 print_time 的任务,它会打印当前时间。 第四步是配置定时任务。在项目目录下创建一个 tasks 目录,然后创建一个名为 beat.py 的文件,添加以下内容: ```python from celery import Celery from celery.schedules import crontab app = Celery() app.conf.timezone = 'Asia/Shanghai' app.conf.beat_schedule = { 'print_time': { 'task': 'your_app.tasks.print_time', 'schedule': crontab(minute='*/1'), }, } ``` 这里的 your_app 是你定义任务的 app 名称,这个配置会让 print_time 这个任务每分钟执行一次。 最后,在命令行中启动 Celery: ``` celery -A your_project worker -l info -Ofair ``` 然后再打开一个命令行窗口,启动定时任务: ``` celery -A your_project beat -l info ``` 这样就完成了 Django 使用 Celery 实现定时任务的配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值