原文出处 http://xugaoxiang.com/post/120
软硬件环境
- ubuntu 16.04 64bit
- python3
- flask
问题描述
在使用web框架flask的时候,经常需要提供HTTP POST接口来处理一些数据,而当多个客户端连接上来的时候,如何并行地处理这些任务经常困扰着我们,本文就来利用concurrent.futures来实现这个功能.
代码实践
具体可以看看行间注释
# -*- coding: utf-8 -*-
# @Time : 18-4-17 下午4:15
# @Author : xugaoxiang
# @Email : [email protected]
# @Website : http://www.xugaoxiang.com
# @File : test.py
# @Software: PyCharm
import os
import time
from flask import Flask, request
from werkzeug.utils import secure_filename
from concurrent.futures import ThreadPoolExecutor
flask_app = Flask(__name__)
# 能接收的图片文件大小
flask_app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024
# 同时处理的最大线程数
executor = ThreadPoolExecutor(10)
# 能接收的文件后缀名
ALLOWED_EXTENSIONS = set(['png','jpg','jpeg'])
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
# 只能接收POST方法
@flask_app.route('/uploadImageFile', methods=['POST'])
def uploadImageFile():
'''
HTTP POST, 接收发送过来的图片数据
:return:
'''
# multipart/form-data file --> key
file = request.files['longjing']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
if not os.path.exists('temp'):
os.mkdir('temp')
file.save(os.path.join('temp', filename))
# 上传的是空文件
if os.stat(os.path.join('temp', filename)).st_size == 0:
os.remove(os.path.join('temp', filename))
return 'Empty image file.'
# 异步任务
executor.submit(do_job, filename)
# 直接返回
return 'POST success.'
else:
return "POST failed."
def do_job(filename):
'''
模拟的异步任务
:param filename:
:return:
'''
print('start do_job, file={}'.format(filename))
time.sleep(10)
print('finish do_job')
if __name__ == '__main__':
flask_app.run(host='0.0.0.0', port=8889)
使用Postman来模拟POST操作