当前位置:   article > 正文

Flask框架实现异步处理请求_flask 异步

flask 异步

        当程序执行过程中多个用户并发执行耗时任务等时,为提高程序性能,这时可以使用异步处理技术来优化系统性能。常见的方法是将请求放到一个线程池或者进程池中进行管理。

        本博文以python自带的concurrent.futures库来实现异步处理任务。这个模块具有线程池和进程池、管理并行编程任务、处理非确定性的执行流程、进程或线程同步等功能。

示例代码1:

  1. import time
  2. from flask import Flask, request
  3. from concurrent.futures import ThreadPoolExecutor
  4. # app初始化
  5. app = Flask(__name__)
  6. # 同时处理的最大线程数,本示例中使用线程池,也可以使用进程池ProcessPoolExecutor,使用方法类似
  7. executor = ThreadPoolExecutor(3)
  8. @app.route("/postInfo", methods=["POST"])
  9. def up_name():
  10. """
  11. 接收传递过来的信息
  12. :return:
  13. """
  14. data = {"data": "data"}
  15. # 执行异步任务
  16. executor.submit(do_job, data)
  17. return data
  18. def do_job(info):
  19. """
  20. 模拟异步任务
  21. :param info:
  22. :return:
  23. """
  24. print(time.time(), "start:", info)
  25. time.sleep(10)
  26. print(time.time(), "end:", info)
  27. if __name__ == '__main__':
  28. app.run()

        使用postman测试工具发起请求,代码中设置的最大异步数为3,本次在postman工具中同时执行请求5次看效果。

运行结果:

示例代码2:

  1. import os
  2. import time
  3. from datetime import datetime
  4. from flask import Flask, request
  5. from werkzeug.utils import secure_filename
  6. from concurrent.futures import ThreadPoolExecutor
  7. # app初始化
  8. app = Flask(__name__)
  9. # 能接收的图片文件的大小
  10. app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024
  11. # 同时处理的最大线程数,本示例中使用线程池,也可以使用进程池ProcessPoolExecutor,使用方法类似
  12. executor = ThreadPoolExecutor(3)
  13. # 能接收的文件后缀名
  14. ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])
  15. # 允许接收的文件类型
  16. def allow_file(filename):
  17. return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
  18. @app.route("/uploadImageFile", methods=["POST"])
  19. def upload_image_file():
  20. """
  21. 上传图片数据
  22. :return:
  23. """
  24. file = request.files['img']
  25. if file and allow_file(file.filename):
  26. filename = secure_filename(file.filename)
  27. if not os.path.exists('temp'):
  28. os.mkdir('temp')
  29. file.save(os.path.join('temp', filename))
  30. # 上传的文件是空文件
  31. if os.stat(os.path.join('temp', filename)).st_size == 0:
  32. os.remove(os.path.join('temp', filename))
  33. return "Empty image file"
  34. # 异步任务
  35. executor.submit(do_job, filename)
  36. return "POST Success"
  37. else:
  38. return "POST failed"
  39. def do_job(filename):
  40. """
  41. 模拟异步任务
  42. :param filename:
  43. :return:
  44. """
  45. print('{}-start do_job, file={}'.format(datetime.now(), filename))
  46. time.sleep(10)
  47. print('{}-finish do_job'.format(datetime.now()))
  48. if __name__ == '__main__':
  49. app.run()

postman测试:

 运行结果:

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号