一、celery架构图
-
生产者消费者模型
-
调度方法
二、配置使用
celery很容易集成到Django框架中,当然如果想要实现定时任务的话还需要安装django-celery-beta插件,后面会说明。需要注意的是Celery4.0只支持Django版本>=1.8的,如果是小于1.8版本需要使用Celery3.1。
配置
创建新项目tasktest,目录结构(每个app下多个tasks文件,用于定义任务)
tasktest
├── app01
│ ├── __init__.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tasks.py
│ └── views.py
├── manage.py
├── taskproj
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── templates
在项目目录 tasktest/tasktest/ 目录下创建 celery.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:wd
# from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tasktest.settings') # 设置django环境
app = Celery('tasktest')
app.config_from_object('django.conf:settings', namespace='CELERY') # 使用CELERY_ 作为前缀,在settings中写配置
app.autodiscover_tasks() # 发现任务文件每个app下的task.py
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
tasktest/tasktest/init.py
from __future__ import absolute_import, unicode_literals
from tasktest.celery import app as celery_app
__all__ = ('celery_app', )
tasktest/tasktest/settings.py
CELERY_BROKER_URL = "redis://127.0.0.1:6379/1"
RESULT_BACKEND = "redis://127.0.0.1:6379/1"
BROKER_TRANSPORT = 'redis'
CELERY_RESULT_SERIALIZER = 'json' # 结果序列化方案
在项目目录下启动worker
-
windows下
celery -A demo2 worker -l info -P eventlet # 需要下载 pip install eventlet
-
linux下
celery -A demo worker -l info
定义与触发任务
定义任务在每个tasks文件中,app01/tasks.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
# 这里不使用@app.task,而是用@shared_task,是指定可以在其他APP中也可以调用这个任务
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
视图中触发任务
from django.http import JsonResponse
from app01 import tasks
# Create your views here.
def index(request,*args,**kwargs):
res=tasks.add.delay(1,3)
#任务逻辑
return JsonResponse({'status':'successful','task_id':res.task_id})
二、celery 定时任务
如果想要在django中使用定时任务功能同样是靠beat完成任务发送功能,当在Django中使用定时任务时,需要安装django-celery-beat插件。以下将介绍使用过程。
安装配置
1.beat插件安装
pip install django-celery-beat
2.注册APP
INSTALLED_APPS = [
....
'django_celery_beat',
]
3.数据库变更
python manage.py migrate django_celery_beat
4.在 tasktest/settings 中追加配置
if USE_TZ:
CELERY_TIMEZONE = TIME_ZONE # 设置时区
# 使用django_celery_beat插件用来动态配置任务!
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
5.分别启动woker和beat
celery -A tasktest beat -l info # 启动celery-beat
celery -A tasktest worker -l info # 启动worker
6.创建用户
python manage.py createsuperuser
7.登录admin进行管理(地址http://127.0.0.1:8000/admin)
实战1 定时任务每天的早上5点执行 app1/add 任务
添加一个计划任务 配置每天早上5点的计划
再返回首页点击任务定义,新建一个任务
创建时要注意
保存后启动 celery-beat 和 worker 就实现一个每天早上5点的定时任务了