Python Flask后端异步处理(二)
在实际的应用场景中,如用户注册,用户输入了注册信息后,后端保存信息到数据库中,然后跳转至登录界面,这些操作用户需要等待的时间非常短,但是如果是有耗时任务,比如对输入的网址进行漏洞扫描,在后端处理就会花费几分钟的时间,不可能让用户等待页面刷新几分钟,所以需要进行后端异步处理。之前使用的后端异步处理时Python的原生线程/进程实现,简洁暴力,自己用的话还行,但是如果是给用户用,就还存在一些不足,现考虑使用Celery替换掉原生线程/进程异步处理。
Celery
Celery是个Python语言实现的异步分布式任务队列服务,除了支持即时任务,还支持定时任务,Celery有五个核心角色。
Task 任务
任务(Task)就是你要做的事情,例如一个注册流程里面有很多任务,给用户发验证邮件就是一个任务,这种耗时的任务就可以交给Celery去处理,还有一种任务是定时任务,比如每天定时统计网站的注册人数,这个也可以交给Celery周期性的处理。
Broker 经纪人,队列,消息传递者
Broker 的中文意思是经纪人,指为市场上买卖双方提供中介服务的人。在Celery中这个角色相当于数据结构中的队列,介于生产者和消费者之间经纪人。例如一个Web系统中,生产者是主程序,它生产任务,将任务发送给 Broker,消费者是 Worker,是专门用于执行任务的后台服务。Celery本身不提供队列服务,一般用Redis或者RabbitMQ来实现队列服务。
Worker 执行者,消费者
Worker 就是那个一直在后台执行任务的人,也成为任务的消费者,它会实时地监控队列中有没有任务,如果有就立即取出来执行。
Beat 定时任务调度器
Beat 是一个定时任务调度器,它会根据配置定时将任务发送给 Broker,等待 Worker 来消费。
Backend 执行结果
Backend 用于保存任务的执行结果,每个任务都有返回值,比如发送邮件的服务会告诉我们有没有发送成功,这个结果就是存在Backend中,当然我们并不总是要关心任务的执行结果。

接下来编写一个简单的python程序来学习使用Celery
首先是安装Celery,因为我的开发平台是Windows,Celery新版是不支持Windows操作系统的,需要下载老版本的,这里参考github上Celery开发者的回答: https://github.com/celery/celery/issues/4178
下载3.1.24版本的Celery
pip3 install celery==3.1.24
此外还要下载Reids,并且启动Redis的服务,此处百度
创建Celery实例
# task.py
from celery import Celery
app = Celery('task', broker='redis://localhost:6379/0')
创建任务
#task.py
@app.task
def send_mail(email):
print("send mail to ", email)
import time
time.sleep(5)
return "success"
默认读者有flask基础,另外这里使用app.task 包装 send_email , 使其成为后台运行的任务
函数使用app.task装饰器修饰之后,就会成为Celery中的一个Task。
启动Worker
启动Worker,监听Broker中是否有任务
celery worker
可以带参数如
celery -A task worker --loglevel=info
-A: 指定 celery 实例所在哪个模块中,--loglevel:显示日志等级
运行后如下

调用任务
在主程序中调用任务,调任务发送给Broker,跟开一个多线程和多进程类似,相当于是把任务丢给了Broker,主程序继续向下执行。
from task import send_mail
def register():
import time
start = time.time()
print("1. 插入记录到数据库")
print("2. celery 帮我发邮件")
send_mail.delay("xx@gmail.com")
print("3. 告诉用户注册成功")
print("耗时:%s 秒 " % (time.time() - start))
if __name__ == '__main__':
register()
因为send_mail被app.task装饰器修饰了,所以我们想要把任务丢给它,使用函数的 .delay方法即可
目录结构为:
── Celery测试
├── task.py
└── user.py
运行user.py,查看运行结果为:

可知
time.sleep(5)
被丢到后台去执行了,所以花费时间这么短。如果按照正常的同步逻辑去实现,至少需要5秒钟的时间,因为存在time.sleep(5)来模拟发送邮件。
在worker服务窗口查看日志信息

跟着大佬们的博客学习了Celery的基本操作,大部分时间去安装环境了,淦
将Celery添加进碎遮项目会在下一篇博客中说到。
请听下回分解 咕咕咕
安装出现的错误
File "d:\python3\lib\site-packages\celery\concurrency\prefork.py", line 20, in <module> from celery.concurrency.base import BasePool File "d:\python3\lib\site-packages\celery\concurrency\base.py", line 21, in <module> from celery.utils import timer2 File "d:\python3\lib\site-packages\celery\utils\timer2.py", line 19 from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger ^ SyntaxError: invalid syntax

参考自:https://www.cnblogs.com/zivli/p/11517797.html
这个是python3.7目前不支持kombu,降低python版本至3.6即可,(又得重新装一波python,没装conda呜呜呜,卸载之前先把python的类库输出到requirements.txt文件
关于卸载python,可以参考这篇博客:https://blog.csdn.net/ke_yi_/article/details/88183474
如果电脑上是python2和python3共存,请看:https://blog.csdn.net/autista/article/details/73650943
弄好了之后再把之前python3.7的库文件恢复到python3.6里面来
pip3 install -r requirements.txt
弄好了之后重新打开python的集成开发环境
celery -A task worker --loglevel=info

可算能运行Celery了
接着运行程序的时候又遇到了
AttributeError: 'str' object has no attribute 'items'

出现该问题的原因是redis版本过高,降低redis版本即可
pip3 install redis==2.10.6
然后就没有遇到其他的坑了,遇到再补:D
参考链接
Python Flask后端异步处理(二)的更多相关文章
- Python Flask后端异步处理(一)
Flask是Python中有名的轻量级同步Web框架,但是在实际的开发中,可能会遇到需要长时间处理的任务,此时就需要使用异步的方式来实现,让长时间任务在后台运行,先将本次请求的相应状态返回给前端,不让 ...
- Python Flask后端异步处理(三)
前一篇博文我们已经将基础知识和环境配置进行了介绍:https://www.cnblogs.com/Cl0ud/p/13192925.html,本篇博文在实际应用场景中使用Celery,对Flask后端 ...
- Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验
(一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...
- 前端和后端的数据交互(jquery ajax+python flask+mysql)
上web课的时候老师布置的一个实验,要求省市连动,基本要求如下: 1.用select选中一个省份. 2.省份数据传送到服务器,服务器从数据库中搜索对应城市信息. 3.将城市信息返回客户,客户用sele ...
- Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)
Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享) 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...
- Flask + vue 前后端分离的 二手书App
一个Flask + vue 前后端分离的 二手书App 效果展示: https://blog.csdn.net/qq_42239520/article/details/88534955 所用技术清单 ...
- python flask框架学习(二)——第一个flask程序
第一个flask程序 学习自:知了课堂Python Flask框架——全栈开发 1.用pycharm新建一个flask项目 2.运行程序 from flask import Flask # 创建一个F ...
- [Python][flask][flask-wtf]关于flask-wtf中API使用实例教程
简介:简单的集成flask,WTForms,包括跨站请求伪造(CSRF),文件上传和验证码. 一.安装(Install) 此文仍然是Windows操作系统下的教程,但是和linux操作系统下的运行环境 ...
- Python+Flask+MysqL的web建设技术过程
一.前言(个人学期总结) 个人总结一下这学期对于Python+Flask+MysqL的web建设技术过程的学习体会,Flask小辣椒框架相对于其他框架而言,更加稳定,不会有莫名其妙的错误,容错性强,运 ...
随机推荐
- Git操作:远程仓库(git remote)的添加、管理和删除
这是你的git仓库,他已经添加了一个远程仓库,可以用git remote -v查看绑定的仓库列表,他会以<仓库名> <仓库地址>的形式展示出来(一个仓库会显示两遍): $ g ...
- CSS3之线性渐变(linear gradients)
线性渐变(linear gradients)沿着一根轴线改变颜色,从起点到终点颜色进行顺序渐变. 语法: background:linear-gradient(direction,color-stop ...
- [MIT6.006] 9. Table Doubling, Karp-Rabin 双散列表, Karp-Rabin
在整理课程笔记前,先普及下课上没细讲的东西,就是下图,如果有个操作g(x),它最糟糕的时间复杂度为Ο(c2 * n),它最好时间复杂度是Ω(c1 * n),那么θ则为Θ(n).简单来说:如果O和Ω可以 ...
- ceph集群的安装和配置教程
本篇主题: 1.怎样配置ssh免登陆访问 2.为什么搭建集群要关闭防火墙和selinux,如何关闭 3.从哪里获取ceph的安装包,怎样安装才是快速正确的 4.为什么要配置时间同步服务,怎样配置 5. ...
- 查询SQL Server数据库使用的版本号信息
如何查询当前连接服务器的数据库版本号,使用以下语句执行即可: select @@version
- H265Nalu头部解析
一 NALU头部解析 F: 必须为0,为1表示语法错误.整包将被丢弃 NalType:nalu包的类型,其中VCL NAL和non-VCL NAL各有32类.0-31是vcl nal单元:32-63, ...
- Java 合并多个文件内容到一个文件(递归遍历某个文件夹下所有文件)
这段代码通过Java I/O流API实现将多个文件合并到一个文件中,输出为文本文件,提供一个支持语法高亮的网站,http://www.codeinword.com/ 适合粘贴代码到word文档,小巧实 ...
- php 进行图片裁剪
<?php $src_path = '1.jpg'; //创建源图的实例 $src = imagecreatefromstring(file_get_contents($src_path)); ...
- 基于Python+requests搭建的自动化框架-实现流程化的接口串联
框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu ...
- sublime text3配置javascript运行环境
步骤一 安装node.js 官网下载链接:node.js 步骤二 Sublime 依次点击 菜单栏 Tools => Build System => New Build System 步骤 ...