Centos7下配置celery+rabbitmq+django执行异步任务和定时任务

单说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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端工匠之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值