django+celery 实现分布式任务

想用django做一个自动运维平台,利用netsnmp来获取交换机及服务器信息,但是snmpget任务需要在后台实时运行,为了不影响html响应,利用celery来结合django做异步任务队列。

一、环境准备
1.首先安装celery
pip3 install celery
2.安装djcelery
pip3 install django-celery
3.安装一个broker
我们必须拥有一个broker消息队列用于发送和接收消息。Celery官网给出了多个broker的备选方案:RabbitMQ、Redis、Database(不推荐)以及其他的消息中间件。本次我们利用redis

sudo apt-get install redis

redis-server
启动redis服务, 端口假设为6379
redis-cli 查看redis 状态
[email protected]:~/Desktop/webserver/myserver# redis-cli
127.0.0.1:6379>

二、django 配置
配置settings.py
首先,在Django工程的settings.py文件中加入如下配置代码:

celery 配置信息 start

#############################
import djcelery

celery 配置

djcelery.setup_loader()
BROKER_URL = ‘redis://127.0.0.1:6379/1‘
CELERY_TIMEZONE = ‘Asia/Shanghai‘
CELERYBEAT_SCHEDULER = ‘djcelery.schedulers.DatabaseScheduler‘
CELERY_IMPORTS = (‘serverapp.task‘)
#############################

celery 配置信息 end

#############################

当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task

? BROKER_URL:broker是代理人,它负责分发任务给worker去执行。我使用的是Redis作为broker

? 没有设置 CELERY_RESULT_BACKEND,默认没有配置,此时Django会使用默认的数据库(也是你指定的orm数据库)。

CELERY_IMPORTS:是导入目标任务文件

CELERYBEAT_SCHEDULER:使用了django-celery默认的数据库调度模型,任务执行周期都被存在默认指定的orm数据库中.

CELERYBEAT_SCHEDULE:设置定时的时间配置, 可以精确到秒,分钟,小时,天,周等。

3.在主工程的配置文件settings.py 中应用注册表INSTALLED_APPS中加入 djcelery

INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘djcelery‘, #加入djcelery
]

4.(3)创建应用实例

? 在主工程目录添加celery.py, 添加自动检索django工程tasks任务

? vim artproject/celery.py

#目的是拒绝隐士引入,celery.py和celery冲突。
from future import absolute_import

import os

from celery import Celery, platforms
platforms.C_FORCE_ROOT = True

os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘, ‘myserver.settings‘)
#Specifying the settings here means the celery command line program will know where your Django project is.
#This statement must always appear before the app instance is created, which is what we do next:
from django.conf import settings

app = Celery(‘serverapp‘)

app.config_from_object(‘django.conf:settings‘)
#This means that you don’t have to use multiple configuration files, and instead configure Celery directly from the Django settings.
#You can pass the object directly here, but using a string is better since then the worker doesn’t have to serialize the object.

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
#With the line above Celery will automatically discover tasks in reusable apps if you define all tasks in a separate tasks.py module.
#The tasks.py should be in dir which is added to INSTALLED_APP in settings.py.
#So you do not have to manually add the individual modules to the CELERY_IMPORT in settings.py.

@app.task(bind=True)
def debug_task(self):
print(‘Request: {0!r}‘.format(self.request)) #dumps its own request information

5.(4) 创建任务 tasks

每个任务本质上就是一个函数,在tasks.py中,写入你想要执行的函数即可。

在应用art中添加我们需要提供的异步服务和定时服务

vim art/tasks.py

#!/usr/bin/env python

encoding: utf-8

from future import absolute_import
import time
from django.core.mail import send_mail
from celery.utils.log import get_task_logger
from artproject.celery import app
?
from art.utils.send_mail import pack_html, send_emailbr/>?
@app.task
def tsend_email():
url = "http://1000phone.com"
receiver = ‘[email protected]‘
content = pack_html(receiver, url)

content = ‘this is email content.‘

send_email(receiver, content)
print(‘send email ok!‘)br/>?
?
@app.task
def add(x, y):
return x+y
6.迁移生成celery需要的数据表

python manage.py migrate
此时数据库表结构多出了几个

7.
8.
9.启动服务,测试
我们可以采用 python manage.py help 发现多出了 celery 相关选项。

(1)启动django celery 服务

启动服务:

python manage.py celery worker --loglevel=info

此时异步处理和定时处理服务都已经启动了

(2)web端接口触发异步任务处理

我们在web端加入一个入口,触发异步任务处理add函数

在应用art的urls.py 中加入如下对应关系

from art.views import add_handler
?
?
url(r‘^add‘, add_handler),

art/views.py 中加入处理逻辑

def add_handler(request):
x = request.GET.get(‘x‘, ‘1‘)
y = request.GET.get(‘y‘, ‘1‘)
from .tasks import add
add.delay(int(x), int(y))
res = {‘code‘:200, ‘message‘:‘ok‘, ‘data‘:[{‘x‘:x, ‘y‘:y}]}
return HttpResponse(json.dumps(res))

启动web服务,通过url传入的参数,通过handler的add.delay(x, y)计算并存入mysql

http://127.0.0.1:8000/art/add?x=188&y=22

(4) 测试定时器,发送邮件

在终端输入 python manage.py celerybeat -l info

会自动触发每隔30s执行一次tsend_email定时器函数,发送邮件:

CELERYBEAT_SCHEDULE = { #定时器策略
#定时任务一: 每隔30s运行一次
u‘测试定时器1‘: {
"task": "art.tasks.tsend_email",
#"schedule": crontab(minute=‘*/2‘), # or ‘schedule‘: timedelta(seconds=3),
"schedule":timedelta(seconds=30),
"args": (),
},
}
具体发送邮件服务程序见下面的第4节

4 邮件发送服务
项目中经常会有定时发送邮件的情形,比如发送数据报告,发送异常服务报告等。

可以编辑文件 art/utils/send_mail.py, 内容编辑如下:

#!/usr/bin/env python
#-- coding:utf-8 --
#written by zhouguangyou
#发送邮件(wd_email_check123账号用于内部测试使用,不要用于其他用途)
?
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header
import time
?
sender = ‘[email protected]‘
subject = u‘api开放平台邮箱验证‘
smtpserver = ‘smtp.163.com‘
username = ‘wwwwww‘
password = ‘wwwww1234‘
mail_postfix="163.com"
?
def send_email(receiver, content):
try:
me = username+"<"+username+"@"+mail_postfix+">"
msg = MIMEText(content, ‘html‘, ‘utf-8‘)
msg[‘Subject‘] = subject
msg[‘From‘] = sender
msg[‘To‘] = receiver
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
return True
except Exception as e:
print(‘send_email has error with : ‘ + str(e))
return False
?
?
def pack_html(receiver, url):
html_content = u"<html><div>尊敬的用户<font color=‘#0066FF‘>%s</font> 您好!</div><br>" \
"<div>感谢您关注我们的平台 ,我们将为您提供最贴心的服务,祝您购物愉快。</div><br>" \
"<div>点击以下链接,即可完成邮箱安全验证:</div><br>" \
"<div><a href=‘%s‘>%s</a></div><br>" \
"<div>为保障您的帐号安全,请在24小时内点击该链接; </div><br>" \
"<div>若您没有申请过验证邮箱 ,请您忽略此邮件,由此给您带来的不便请谅解。</div>" \
"</html>" % (receiver, url, url)
html_content = html_content
return html_content
?
?
if name == "main":
url = "
http://xxxx.com"
receiver = ‘[email protected]‘
#content = pack_html(receiver, url)
content = ‘this is email content. at %s.‘%int(time.time())
send_email(receiver, content)

至此,在celery ui界面可以看到两类,定时器处理和异步处理。

原文地址:http://blog.51cto.com/lianlongfei/2315530

时间: 2024-10-17 00:28:21

django+celery 实现分布式任务的相关文章

django celery的分布式异步之路(一) hello world

设想你遇到如下场景: 1)高并发 2)请求的执行相当消耗机器资源,流量峰值的时候可能超出单机界限 3)请求返回慢,客户长时间等在页面等待任务返回 4)存在耗时的定时任务 这时你就需要一个分布式异步的框架了. celery会是一个不错的选择.本文将一步一步的介绍如何使用celery和django进行集成,并进行分布式异步编程. 1.安装依赖 默认你已经有了python和pip.我使用的版本是: python 2.7.10 pip 9.0.1virtualenv 15.1.0 创建沙盒环境,我们生产

结合Django+celery二次开发定时周期任务

需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还能满足他们,优化脚本之后只要开发提供查询数据的SQL.收件人.执行时间等等参数就可以几分钟写完一个定时任务脚本 ,到后面不知道是不是吃药了一天三四个定时任务,不到半个月手里一下就20多个定时任务了,渐渐感到力不从心了,而且天天还要给他们修改定时任务的SQL.收件人.执 行时间等等,天天写定时任务脚本

django+celery配置(定时任务)

下面介绍一下django+celery的配置做定时任务 1.首先介绍一下环境和版本 python==2.7 django == 1.8.1 celery == 3.1.23 django-celery == 3.1.17 2.celery的安装   sudo pip install celery==3.1.23 sudo pip install django-celery==3.1.17 3.新建一个项目 (1)django-admin startproject django_celery_de

Django &amp; Celery – Easy async task processing 翻译

So, while developing a web application, there comes a time when we need to process some of the tasks in the background, perhaps asynchronously. For example, your user would upload photos and the app would post them to multiple social networks. We wou

django+celery+redis环境搭建

初次尝试搭建django+celery+redis环境,记录下来,慢慢学习~ 1.安装apache 下载httpd-2.0.63.tar.gz,解压tar zxvf httpd-2.0.63.tar.gz,cd httpd-2.0.63, ./configure --prefix=/usr/local/apache --enable-mods=all --enable-cache --enable-mem-cache --enable-file-cache --enable-rewrite(这一

python—Celery异步分布式

Celery异步分布式 Celery是一个python开发的异步分布式任务调度模块 Celery本身并不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbimq,redis, 数据库等 使用redis连接url的格式为: redis://:[email protected]:port/db_number 例如: BROKER_URL = 'redis://localhost:6379/0' 1)huang.py from celery import Celery bro

django+celery+redis环境配置

celery是python开发的分布式任务调度模块 Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,celery支持的消息服务有RabbitMQ,redis甚至是数据库,redis是最佳选择 已安装配置好环境python3.x 已成功安装django 1.安装依赖包: cmd下执行命令: ...>pip3 install celery ...>pip3 install redis ...>pip3 install django-celery ...>pip3 i

django celery使用

celery的简单介绍 Celery的主要用处是执行异步任务, 可以选择延期或定时执行功能. 第一, 假设用户正发起一个request, 并等待request完成后返回. 在这一request后面的view功能中, 我们可能需要执行一段花费很长时间的程序任务, 这一时间可能远远大于 用户能忍受的范围. 当这一任务并不需要立刻执行时,我们便可以使用Celery在后台执 行, 而不影响用户浏览网页. 当有任务需要访问远程服务器完成时, 我们往往都无法确 定需要花费的时间. 第二则是定期执行某些任务.

django+celery实现异步任务

在django项目中常常需要有些耗时的任务,比如发送邮件.短信啥的,这种情况使用celery就非常有用了.celery有原生的也有第三方封装的django-celery,但是django-celery更新不及时,而且不支持celery4,这都出来两年了(看下commit 这两年半django-celery也没怎么提交新的代码),但是毕竟方便,就先安装这个出了问题再更换吧 安装 pip install django-celery 原文地址:https://www.cnblogs.com/wsqy/