Django中Celery的实现介绍(一)
Django中Celery的实现
Celery官网http://www.celeryproject.org/
学习资料:http://docs.jinkan.org/docs/celery/
- Celery介绍
Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。
上图展示的是Celery的架构,它采用典型的生产者-消费者模式,主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)。
消息中间件:Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ。
任务执行单元:Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。
任务结果存储:Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache。
实际应用中,用户从Web前端发起一个请求,我们只需要将请求所要处理的任务放入任务队列broker中,由空闲的worker去处理任务即可,处理的结果会暂存在后台数据库backend中。我们可以在一台机器或多台机器上同时起多个worker进程来实现分布式地并行处理任务。
- 安装
pip install django 安装django
pip install celery==3.1.23 安装celery
pip install django-celery 安装django-celery
对Redis的支持需要额外的依赖。你可以用 celery[redis] 捆绑 同时安装 Celery 和这些依赖
pip install -U celery[redis]
pip install python-jenkins 安装jenkins
- 消息队列
yum install -y rabbitmq-server 安装rabbitmq
环境变量PATH加入/usr/lib/rabbitmq/bin
rabbitmq-plugins enable rabbitmq_management 启用web管理插件
chkconfig rabbitmq-server on 开机自启动
/etc/init.d/rabbitmq-server start 启动RabbitMQ
增加用户
rabbitmqctl add_user shhnwangjian 123456
rabbitmqctl set_user_tags shhnwangjian administrator
命令执行成功后,rabbitmq-server就已经安装好并运行在后台了。
WEB页面访问:http://ip地址:15672/
另外也可以通过命令rabbitmq-server来启动rabbitmq server以及命令rabbitmqctl stop来停止server。
更多的命令可以参考rabbitmq官网的用户手册:https://www.rabbitmq.com/manpages.html
redis 安装 http://redis.io/download
- django中celery实现
创建项目和app
1 2 3 | django - admin.py startproject celery - wj cd celery - wj django - admin.py startapp app01 |
配置settings.py
当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task。
BROKER_URL和CELERY_RESULT_BACKEND分别指代你的Broker的代理地址以及Backend(result store)数据存储地址。
在Django中如果没有设置backend,会使用其默认的后台数据库用来存储数据。注意,此处backend的设置是通过关键字CELERY_RESULT_BACKEND来配置,与一般的.py文件中实现celery的backend设置方式有所不同。一般的.py中是直接通过设置backend关键字来配置,如下所示:
1 | test = Celery( 'tasks' , backend = 'redis://10.10.83.162:16379/0' , broker = 'redis://10.10.83.162:16379/9' ) |
Django下要查看其他celery的命令,包括参数配置、启动多worker进程的方式都可以通过python manage.py celery --help来查看:
创建一个task
1 2 3 4 5 6 7 | # -*- coding: utf-8 -*- from celery import task @task def add(x, y): return x + y |
注意:与一般的.py中实现celery不同,tasks.py必须建在各app的根目录下,且不能随意命名。
views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # -*- coding: utf-8 -*- from django.shortcuts import HttpResponse, render, redirect, HttpResponseRedirect from app01 import tasks def add_test(request): result = tasks.add.delay( 2 , 2 ) print result if result.ready(): print "Task has run" if result.successful(): print "Result was: %s" % result.result else : if isinstance (result.result, Exception): print "Task failed due to raising an exception" raise result.result else : print "Task failed without raising exception" else : print "Task has not yet run" return HttpResponse(result) |
urls.py
1 2 3 4 5 6 7 8 | from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r '^admin/' , admin.site.urls), url(r '^add/$' , views.add_test, name = 'add' ), ] |
#先启动服务
python manage.py runserver 0.0.0.0:9008
#再启动worker
python manage.py celery worker -c 4 --logievel=info
通过terminal测试task
python manage.py shell
>>> from app01 import tasks
>>> tasks.add.delay(3,5)
通过页面访问测试task
- Celery的可视化监控工具flower
1.安装flower
pip install flower
2.启动
python manage.py celery flower --port=9008(默认是5555端口)
3.帮助
python manage.py celery flower --help
4.可视化页面
http://localhost:9008
参考博客:http://www.cnblogs.com/znicy/p/5626040.html
Django中如何使用django-celery完成异步任务: http://www.weiguda.com/blog/73/
djcelery入门:实现运行定时任务: http://my.oschina.net/kinegratii/blog/292395
http://docs.jinkan.org/docs/celery/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架