您现在的位置是:网站首页 > 分类 > 文章详情

celery+redis中间人+django-celery

T2018年9月13日 10:38376人围观
简介celery4.0已经砍掉了djcelery这个插件,所以我们要使用的话就用celery3.x版本。因为djcelery插件能够监控到新增的任务,不需要重启celery服务,所以还是比较又价值的(PS:从celery4.0开始我们修改任务后,必须重启celery服务才行,这样的话就需要进行二次开发)

1、windwos下安装redis

1)打开https://github.com/MSOpenTech/redis/releases下载msi安装包
2)将安装后redis目录下的redis.windows.conf文件拷贝到C:\Users\xxx(也就是进入cmd时看到的盘符地址),最后执行redis-server.exe redis.windows.conf启动redis

2、进入虚拟环境安装

pip install celery-with-redis
pip install django-celery
注意:安装celery-with-redis后,使用pip list看下安装的redis版本是否是小于3.0的,如果不是,那么就得删除下redis,然后重写pip install redis==2.10.6,不然后面可能会报错

3、更新数据库

python manage.py makemigrations
python manage.py migrate

4、settings配置

INSTALLED_APPS = [djcelery,]  # 加入定时任务
# celery settings
# celery中间人 redis://redis服务所在的ip地址:端口/数据库
BROKER_URL = 'redis://localhost:6379/0'
# celery结果返回,可用于跟踪结果
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
# celery内容等消息的格式设置
CELERY_ACCEPT_CONTENT = ['application/json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
# celery时区设置,使用settings中TIME_ZONE同样的时区
CELERY_TIMEZONE = TIME_ZONE
# 跑完3个任务就销毁work(防止积累太多内存不释放)
CELERYD_MAX_TASKS_PER_CHILD = 3
# 定时任务调度器
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

5、setting同目录下新建celery.py(叫celery可能会和关键字重名,最好起个其它名字),配置下celery

# coding:utf-8
from __future__ import absolute_import, unicode_literals

from celery import Celery
from django.conf import settings
import os

# 获取当前文件夹名,即为该Django的项目名
project_name = os.path.split(os.path.abspath('.'))[-1]
project_settings = '%s.settings' % project_name

# 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings)

# 实例化Celery
app = Celery(project_name)

# 使用django的settings文件配置celery
app.config_from_object('django.conf:settings')

# Celery加载所有注册的应用
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

6、settings同目录下的__init__.py配置(用于django运行时引入celery)

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app  # 引入celery对象,就是django运行时加载celery.py文件

7、新建一个app,建立task.py

from celery.task import task
import time


# 异步任务
@task
def sendmail(email):
    print('start send email to %s' % email)
    time.sleep(5)  # 休息5秒
    print('success')
    return True

# 定时任务
@task
def some_task():
    print('periodic task test!!!!!')
    time.sleep(5)
    print('success')
    return True

8、新建的app中views.py下调用tasks.py中的异步方法(主要就用x.dealy())

from django.http import HttpResponse

from .models import Blog
from .tasks import sendmail
import json


# 这里主要就是异步任务,跟定时没关系哈,定时相关的都在task.py中定义,然后在django admin中配置
def home(request):
    # 耗时任务
    sendmail.delay('test@test.com')  # 方法二:采用异步

    # 其他行为
    data = list(Blog.objects.values('caption'))
    return HttpResponse(json.dumps(data), content_type='application/json')

9、启动定时任务worker和beat(当然前提是你已经启动了redis,没有这个中间人不行)

celery -A myproject beat -l info  # 启动定时任务worker,myproject是工程名
Celery -A myproject worker -l info  # beat

10、最后,你可以去django admin配置Crontabs、Periodic tasks用来达到你的定时目的



最后的最后,展示下三个图,可能更加明白点
redis启动
beat启动
worker启动

上面涉及的代码,git地址:https://github.com/wuyajun2016/djceleryLearn.git
参考:

https://www.cnblogs.com/huangxiaoxue/p/7266253.html
http://yshblog.com/blog/163

文章评论

阿里云-云大使推广
阿里云-云服务器推广

微信公众号