前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django中Celery的实现介绍(一)

Django中Celery的实现介绍(一)

作者头像
菲宇
发布2019-06-11 20:22:26
2.1K0
发布2019-06-11 20:22:26
举报
文章被收录于专栏:菲宇

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。

  • 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年05月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Celery介绍
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档