在使用Flask开发python的web应用时,可能会遇到需要较长时间处理的任务,此时就需要使用异步的方式来实现,让长时间任务在后台运行,先将本次请求的响应状态返回给前端,不然前端界面"卡顿",当异步任务处理好后,如果需要返回状态,再将状态返回。

下面介绍两种常用的方式

(1)使用线程的方式

当要执行耗时任务时,直接开启一个新的线程来执行任务,这种方式最为简单快速。

通过ThreadPoolExecutor来实现

asyn_request_demo.py

# -*- coding: UTF-8 -*-
"""
# rs
"""
from logzero import logger
import time
from flask import Flask
from flask_restful import Api
from flask import jsonify
from flask import make_response
from concurrent.futures import ThreadPoolExecutorexecutor = ThreadPoolExecutor()
# executor = ThreadPoolExecutor(10) 里面的数字是线程池所能同时进行的最大数量 app = Flask(__name__)
api = Api(app)def run(name, age):"""# 异步任务"""time.sleep(3)logger.info("name: %s, age: %s." % (name, age))logger.info("耗时任务执行结束")@app.route('/test')
def test():# 传递多个参数args = ["rongsong", "28"]# 交给线程去处理耗时任务, 异步执行executor.submit(lambda p: run(*p), args)# 直接返回结果result = {"code": "200","message": "success","data": "green"}return make_response(jsonify(result))if __name__ == "__main__":# 启动一个HTTP服务app.run(host="0.0.0.0", port=8800, debug=True)
  • 使用pip3安装相应的库(不再赘述)。
  • 使用python3  asyn_request_demo.py运行启动即可(启动端口8800,可修改)。
  • 然后访问http://{执行机器所在IP}:8800/test观察。
  • 预期可以看到:接口直接返回result结果(同步),后台日志等待5s左右打印日志"耗时任务执行结束"(异步)。

当要执行一些比较简单的耗时任务时可以使用这种方式,如发邮件、发送短信验证码等。

当这种方式有个很明显的问题,就是我们无法得到任务的执行状态

如果想要随时得到任务的执行状态,就需要设计一些逻辑,比如奖任务执行状态存储到Redis中,通过唯一的任务id进行标识,然后再写一个接口通过任务id去获取任务的状态,然后让前端定时的去请求该接口,从而获得任务状态信息。

是不是有点复杂,如果让我们自己实现的话,哈哈哈,别慌,Celery框架刚好实现了这样的逻辑,比较成熟,一般我们遇到问题时都可以先看看有没有现成的框架和方法,毕竟站在巨人的肩膀上我们可以看的更远。

(2)使用Celery的方式

Celery是定时任务处理和调度的分布式任务队列,常用于web异步任务、定时任务等。

Python + Flask 执行异步任务相关推荐

  1. 基于Python Flask框架+jquery Ajax技术实现的增删改查(CRUD)+Ajax的异步文件上传

    运行界面(话不多说先上图) 运行之后的index界面,有登陆.注册功能 登陆界面,输入数据库中用户名.密码不为空且密码是加密的数据,进入main界面 注册界面,用的bootstrop的弹窗,用户名和密 ...

  2. Python+Flask

    Web 项目学习笔记(持续更新) 开发Web项目的学习笔记-Python+Flask 表单与文本联动 补充 input 作为单选按钮类型 使用Python编码和解码Json对象 JQuery快速上手 ...

  3. 『Python学习笔记』Python中的异步Web框架之fastAPI介绍RestAPI

    Python中的异步Web框架之fastAPI介绍&RestAPI 文章目录 一. fastAPI简要介绍 1.1. 安装 1.2. 创建 1.3. get方法 1.4. post方法 1.5 ...

  4. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (I)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架(I 第一部) 0. 本系列教程 1. 准备 a.python b. flask c. flask 环境安装 d. f ...

  5. fastapi python 并发_FastAPI 异步代码、并发和并行

    作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢! 我们这里探讨下关于异步代码.并行和并发的一些概念. 一.初探 1.如果我们使 ...

  6. python flask高级编程之restful_('Python Flask高级编程之RESTFul API前后端分离精讲',),全套视频教程学习资料通过百度云网盘下载...

    资源详情 r n t某课网好评度100%的Python Flask高级编程之RESTFul API前后端分离精讲 r n t t t第1章 随便聊聊 r n t t t聊聊Flask与Django,聊 ...

  7. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  8. python Flask框架如何请求及返回数据——flask详细教程

    python Flask框架如何请求及返回数据--flask详细教程 文章目录: 1 Flask介绍 1.1 Flask简单介绍 1.2 Flask相关资料信息 2 Flask快速入门 2.1 Fla ...

  9. python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器

    在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...

最新文章

  1. mysql数据库语法_MySQL数据库基本语法
  2. 周志华 机器学习 笔记
  3. 【Spark机器学习速成宝典】模型篇01支持向量机【SVM】(Python版)
  4. 打造安全的网站服务器
  5. Github标星1.6W+,程序员不得不知的“潜规则”又火了,早知道就不会秃头了
  6. html 手动添加thead,HTML表格 - 我可以在thead之前添加额外的tbody吗?
  7. 总算解决了路由器上iptables的nat问题
  8. js 添加属性_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__
  9. os.path 大全
  10. Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present(LIS)
  11. IE漏洞被黑客利用,导致全球上万个网站受害
  12. 为什么谋生是不道德的
  13. Kepserver如何连接InTouch
  14. 最简单的java代码【java基本语法】
  15. Attention Mechanisms in Computer Vision: A Survey论文阅读
  16. Bad Rabbit
  17. 白话区块链 之 12 - 未花费事务输出 (UTXO) 是什么?
  18. 《Android开发艺术探索》第7章- Android 动画深入分析读书笔记
  19. 快捷键没有响应的处理办法
  20. 软件项目管理复习(一-七章)

热门文章

  1. 551. 学生出勤记录 I
  2. redis解决了分布式系统的session一致性问题
  3. 中专计算机总结论文,中专计算机毕业论文...doc
  4. java fork join demo_Fork/Join框架 demo
  5. java 枚举获取key_「Java必修课」HashMap性能很好?问过我EnumMap没
  6. android textview adapter,Android在FragmentPagerAdapter中的Fragment中设置TextView文本
  7. mysql外部关联视图_MySQL数据库 : 自关联,视图,事物,索引
  8. 英文字符串过长,QLabel显示不全的问题
  9. webpack4+vue打包简单入门
  10. ajax请求返回整个页面,页面里的javascript执行问题(requireJS)