python:在Django项目中使用Celery实现定时任务--简单版

时间:2022-02-01 20:45:54

背景

在最近的一个开发项目中,基于django,但需要后台定时去相应的接口抓取数据并存放到mysql中


Celery简介

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。

它是一个专注于实时处理的任务队列,同时也支持任务调度。

Celery 有广泛、多样的用户与贡献者社区,你可以通过 IRC或是 邮件列表 加入我们。

Celery 是开源的,使用 BSD 许可证 授权。


开始

1. 安装celery

    pip install celery

2. 使用redis方案

    yum install redis python-redis

    service redis start

3. 配置django

project/setting.py

# django celery
<span style="color:#FF0000;">import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_TASK_RESULT_EXPIRES = 10
CELERYD_LOG_FILE = BASE_DIR + "/logs/celery/celery.log"
CELERYBEAT_LOG_FILE = BASE_DIR + "/logs/celery/beat.log"
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']</span>

# Application definition

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'gunicorn',
<span style="color:#FF0000;">'djcelery'</span>,
'xxxx',
]

4. 新建tasks.py文件

该文件是写任务的文件

from celery import Celery
import redis
import time

broker = 'redis://127.0.0.1:6379/0'

app = Celery('tasks', broker=broker)
app.conf.update(
CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/1'
)
注意:上面代码中的app初始化分为两部分进行的,broker和BACKEND分开写,亲测必须这样分开才有效

            好多文章直接写成 app = Celery('tasks', broker='redis://127.0.0.1:6379/0', backend='redis://127.0.0.1:6379/1')是没有效果的,任务永远无法结束

5. 新建任务

@app.task
def add(x, y):
return x + y

6. 定时任务设置

a. 同步数据库

    python manager.py makemigrations

    python manager.py migrate

b. 启动django

    python manager.py runserver

c. 用浏览器打开127.0.0.1/admin     

    python:在Django项目中使用Celery实现定时任务--简单版

    点击Crontabs后面的Add来添加一个定时器

    python:在Django项目中使用Celery实现定时任务--简单版

    这里与linux的crontab类似, 上面的图中建立了一个每分钟的定时器

    然后回到主页上,点击Periodic tasks后面的Add来新建一个定时任务

    python:在Django项目中使用Celery实现定时任务--简单版

     Name: 随便写一个

     Task(registered):选择前面新建的add任务

     Crontab:选择前面新建的crontab

7. 启动定时任务

    python manager.py celery worker -B -l info

    worker:启动celery broker

    -B: 启动celery beat,该进程在定时到达时会自动向broker中加一条任务

    -l info:启动celery日志