提交 5a104159 编写于 作者: H Helin Wang

Make serve server use multi-thread handler, to prevent HTTP OPTIONS get stuck

上级 2994e661
...@@ -4,6 +4,8 @@ import traceback ...@@ -4,6 +4,8 @@ import traceback
import paddle.v2 as paddle import paddle.v2 as paddle
from flask import Flask, jsonify, request from flask import Flask, jsonify, request
from flask_cors import CORS from flask_cors import CORS
from Queue import Queue
import threading
tarfn = os.getenv('PARAMETER_TAR_PATH', None) tarfn = os.getenv('PARAMETER_TAR_PATH', None)
...@@ -35,26 +37,47 @@ def successResp(data): ...@@ -35,26 +37,47 @@ def successResp(data):
return jsonify(code=0, message="success", data=data) return jsonify(code=0, message="success", data=data)
sendQ = Queue()
recvQ = Queue()
@app.route('/', methods=['POST']) @app.route('/', methods=['POST'])
def infer(): def infer():
global inferer sendQ.put(request.json)
success, resp = recvQ.get()
if success:
return successResp(resp)
else:
return errorResp(resp)
# PaddlePaddle v0.10.0 does not support inference from different
# threads, so we create a single worker thread.
def worker():
paddle.init(use_gpu=with_gpu)
with open(tarfn) as param_f, open(topology_filepath) as topo_f:
params = paddle.parameters.Parameters.from_tar(param_f)
inferer = paddle.inference.Inference(parameters=params, fileobj=topo_f)
while True:
j = sendQ.get()
try: try:
feeding = {} feeding = {}
d = [] d = []
for i, key in enumerate(request.json): for i, key in enumerate(j):
d.append(request.json[key]) d.append(j[key])
feeding[key] = i feeding[key] = i
r = inferer.infer([d], feeding=feeding) r = inferer.infer([d], feeding=feeding)
except: except:
trace = traceback.format_exc() trace = traceback.format_exc()
return errorResp(trace) recvQ.put((False, trace))
return successResp(r.tolist()) continue
recvQ.put((True, r.tolist()))
if __name__ == '__main__': if __name__ == '__main__':
paddle.init(use_gpu=with_gpu) t = threading.Thread(target=worker)
with open(tarfn) as param_f, open(topology_filepath) as topo_f: t.daemon = True
params = paddle.parameters.Parameters.from_tar(param_f) t.start()
inferer = paddle.inference.Inference(parameters=params, fileobj=topo_f)
print 'serving on port', port print 'serving on port', port
app.run(host='0.0.0.0', port=port, threaded=False) app.run(host='0.0.0.0', port=port, threaded=True)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册