单说Python web框架我们知道django和flask这些应用比较多的框架都是同步框架,
同步指页面无法进行异步加载,通俗一点就是你的业务逻辑只能在该页面进行,当任务没有执行完的时候,你跳转页面,或者别的操作后导致你的任务没有完全处理完成,导致整个业务有很大的漏洞,
在用户体验方面也是不好的,异步处理目的是高度解耦,使一些时间过长,任务过多的操作保存起来,交给后台慢慢处理,保证了用户的基本操作不会受到影响,也提高了后台服务器处理的压力,
我们这里就使用celery定时或者异步处理,rabbitmq作为broker,保证程序的完美运行。
以下是在真实环境下安装步骤过程,
系统环境
centos 7.3
django 1.11.5
django-celery 3.2.2
rabbitmq 3.61
erlang 19.3
1 编译安装方式 安装erlang语言环境(rabbitmq需要的特定环境)
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC unixODBC-devel httpd python-simplejson
2 erlang语言环境的安装(rabbitMq是用erlang分布式语言开发的,下载版本可能略有不同)
wget http://erlang.org/download/otp_src_19.2.tar.gz
2.1解压elang压缩包:
tar -xzvf otp_src_19.2.tar.gz
2.2进入erlang目录:
cd otp_src_19.2
2.3编译安装erlang语言环境 prefix=/usr/local/erlang 为安装目录(编译过程中可能出现问题):
参考文献
https://www.cnblogs.com/gotodsp/p/7183811.html
我安装过程中出现java环境编译失败,但是我生产过程中没有使用java环境,所以直接略过问题,make install 安装了,也是参考博客安装的,后来成功啦!
./configure --prefix=/usr/local/erlang --enable-smp-support --enable-threads --enable-sctp --enable-kernel-poll --enable-hipe --with-ssl --without-javac
erlang语言编译配置选项:
–prefix 指定安装目录
–enable-smp-support启用对称多处理支持(Symmetric Multi-Processing对称多处理结构的简称)
–enable-threads启用异步线程支持
–enable-sctp启用流控制协议支持(Stream Control Transmission Protocol,流控制传输协议)
–enable-kernel-poll启用Linux内核poll
–enable-hipe启用高性能Erlang –with-ssl 启用ssl包 –without-javac
不用java编译
2.4开始安装编译:
make && make install
2.5配置erlang环境变量:
vim /etc/profile
export PATH=$PATH:/usr/local/erlang/bin
source /etc/profile
2.6测试erlang安装是否成功:
erl Erlang/OTP 17 [erts-6.2] [source] [smp:2:2] [async-threads:10] [kernel-poll:false]
Eshell V6.2 (abort with ^G)
会输出 erlang安装版本号
3 下载安装配置RabbitMQ:
3.1下载安装:
cd /usr/local //切换到计划安装RabbitMQ的目录,我这里放在/usr/local
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-generi
c-unix-3.6.1.tar.xz //下载RabbitMQ安装包
xz -d rabbitmq-server-generic-unix-3.6.1.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.6.1.tar
解压后多了个文件夹rabbitmq-server-3.6.1 ,重命名为rabbitmq以便操作。
mv rabbitmq_server-3.6.1/ rabbitmq
3.2配置rabbitmq环境变量:
vi /etc/profile
#set rabbitmq environment
export PATH=$PATH:/usr/local/rabbitmq/sbin
source /etc/profile
3.3启动服务:
rabbitmq-server -detached //启动rabbitmq,-detached代表后台守护进程方式启动。
3.4查看状态,如果显示如下截图说明安装成功:
rabbitmqctl status
3.5其他相关命令
启动服务:rabbitmq-server -detached【 /usr/local/rabbitmq/sbin/rabbitmq-server -detached 】
查看状态:rabbitmqctl status【 /usr/local/rabbitmq/sbin/rabbitmqctl status 】
关闭服务:rabbitmqctl stop【 /usr/local/rabbitmq/sbin/rabbitmqctl stop 】
列出角色:rabbitmqctl list_users
3.6配置网页插件:
首先创建目录,否则可能报错:
mkdir /etc/rabbitmq
然后启用插件:
rabbitmq-plugins enable rabbitmq_management
3.7配置防火墙:
配置linux 端口 15672 网页管理 5672 AMQP端口:
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=5672/tcp
systemctl restart firewalld.service
现在你在浏览器中输入服务器IP:15672 就可以看到RabbitMQ的WEB管理页面了,是不是很兴奋,可是你没有账号密码,别急。
3.7配置访问账号密码和权限:
默认网页是不允许访问的,需要增加一个用户修改一下权限,代码如下:
rabbitmqctl add_user superrd superrd //添加用户,后面两个参数分别是用户名和密码,我这都用superrd了。
rabbitmqctl set_permissions -p / superrd “." ".” “.*” //添加权限
rabbitmqctl set_user_tags superrd administrator //修改用户角色
然后就可以远程访问了,然后可直接配置用户权限等信息。
登录:http://ip:15672 登录
4 celery安装及其Django内部文件配置:
4.1 安装celery:
pip3 install celery
4.2 celery用在django项目中,django项目目录结构(简化)如下
4.3 创建website/celery.py主文件![在这里插入图片描述](https://img-blog.csdnimg.cn/20190411105715200.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzE3ODEwMw==,size_16,color_FFFFFF,t_70
去掉注释简版代码如下
from future import absolute_import, unicode_literals
import os
from celery import Celery, platforms
from django.conf import settings
os.environ.setdefault(‘DJANGO_SETTINGS_MODULE’, ‘website.settings’)
app = Celery(‘website’)
app.config_from_object(‘django.conf:settings’)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
platforms.C_FORCE_ROOT = True
@app.task(bind=True)
def debug_task(self):
print(‘Request: {0!r}’.format(self.request))
5.各应用创建tasks.py文件,这里为deploy/tasks.py
from future import absolute_import
from celery import shared_task
@shared_task
def add(x, y):
import time
time.sleep(10)
return x + y
注意tasks.py必须建在各app的根目录下,且只能叫tasks.py,不能随意命名
6.views.py中引用使用这个tasks异步处理:
from deploy.tasks import add
def show_file(request):
add.delay(2,3)
return JsonResponse(”ok”, safe=False)
使用函数名.delay()即可使函数异步执行
可以通过result.ready()来判断任务是否完成处理
如果任务抛出一个异常,使用result.get(timeout=1)可以重新抛出异常
如果任务抛出一个异常,使用result.traceback可以获取原始的回溯信息
7 生成celery的数据库表
python manage.py migrate
或者
python manage.py syncdb
8.启动celery:
python manage.py celery worker --loglevel=info
这样在调用show_file这个方法时,里边的add就可以异步处理了
Celery 定时任务配置,异步任务和计划任务同时开启
没有使用rabbitmq 作为broker,使用其他broker需要配置的信息如下,
参考文献
https://mp.weixin.qq.com/s/lXrp3igYo9W2UuE5Gauysg
参考文章
http://docs.celeryproject.org/en/latest/
https://github.com/pylixm/celery-examples
https://pylixm.cc/posts/2015-12-03-Django-celery.html
https://blog.csdn.net/yin767833376/article/details/81223491