背景
在最近的一个开发项目中,基于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注意:上面代码中的app初始化分为两部分进行的,broker和BACKEND分开写,亲测必须这样分开才有效
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 = 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
点击Crontabs后面的Add来添加一个定时器
这里与linux的crontab类似, 上面的图中建立了一个每分钟的定时器
然后回到主页上,点击Periodic tasks后面的Add来新建一个定时任务
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日志