前言
第一次参与实习工作,S小白中完成的第一项项目任务,简要整理一下:
一、任务需求
任务目标:实现算法与后端联调,配置接口。
md文档展示接口需求:
接口解释为:后端传入数据给模型,模型生成所需结果。
接口接收的数据如json格式一所示,接口返回数据为json格式二所示。
接口解释为:依据接口一给出的结果,后端传入数据给模型,模型返回所需结果。
接口接收的数据如json格式一所示,接口返回数据为json格式二所示。
二、实现过程
1.代码过程
Flask启动:
from flask import Flask
from werkzeug.middleware.proxy_fix import ProxyFix
from view_link import api
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
#app_config.py文档中要配置HOST(地址)、PORT(端口)
app.config.from_pyfile('config/app_config.py')
api.init_app(app)
app.run(host=app.config['HOST'], port=app.config['PORT'], debug=app.config['DEBUG'], threaded=False, use_reloader=False)
接口1:
@api.route('/gen_smi_qa', )
class genQA(Resource):
@api.doc('生成相似问句')
def post(self):
logger.debug('Process {} - Thread {}'.format(os.getpid(), threading.current_thread().ident))
logger.info('\n前台传参:{}'.format(api.payload))
try:
request_data = api.payload
qaList = request_data['qaList']
qaId = []
question = []
for item in qaList:
qaId.append(item["qaId"])
question.append(item["question"])
num = request_data['num']
# 未添加线程
similarQuestions = ''
batchId = smi_qa_gen.create_sim_record(qaId, question, num, similarQuestions)
# smi_qa_gen.gen_smi_query(batchId, question, num)
# 添加线程(尝试很多方法,其他失败)
**pool.run(smi_qa_gen.gen_smi_query, (batchId, question, num,))**
# pool.run(smi_qa_gen.gen_smi_query,args = (batchId, question, num))
# threading.Thread(target=smi_qa_gen.gen_smi_query, args=(batchId, question, num,))
# batchId = smi_qa_gen.create_batchId()
# threads = [threading.Thread(target=smi_qa_gen.create_sim_record,args=(batchId,qaId,question,num,similarQuestions,)),
# threading.Thread(target=smi_qa_gen.gen_smi_query,args=(batchId, question, num,))]
# for t in threads:
# t.start()
# 返回状态码及batchId
return {
'retCode': 0,
'data': {
'batchId': batchId
}
}
except Exception as e:
exception_id = str(uuid.uuid1())
logger.error('exceptionId:{}\tmessage:{}'.format(exception_id, traceback.format_exc()))
return {
'retCode': 999999,
'message': str(e),
'exceptionId': exception_id
}, 500
接下来一整个方法套用方法的过程:
难点:多线程实现
接口2:
@api.route('/get_smi_qa', )
class simQA(Resource):
@api.doc('查询状态并获取相似问句')
# @api.expect(text_field)
def post(self):
logger.debug('Process {} - Thread {}'.format(os.getpid(), threading.current_thread().ident))
logger.info('\n前台传参:{}'.format(api.payload))
try:
request_data = api.payload
batchId = request_data['batchId']
# 定义方法检测生成状态
record = smi_qa_gen.gen_smi_status(batchId)
if not record:
return {
'retCode': 0,
'data': {
'status': 999
}
}
# 模型存在且在生成状态
status = record['genStatus']
if status == 0:
return {
'retCode': 0,
'data': {
"status": status,
"result": []
}
}
elif status == 1:
similarQuestions, question, qaId = smi_qa_gen.get_smi_query(batchId)
print(similarQuestions, question, qaId)
result_list = []
for index in range(len(question)):
dict_single = {}
dict_single["qaId"] = qaId[index]
dict_single["question"] = question[index]
dict_single["similarQuestions"] = similarQuestions[index]
result_list.append(dict_single)
return {
'retCode': 0,
'data': {
"status": status,
"result": result_list
}
}
else:
return {
'retCode': 0,
'data': {
"status": -1,
"result"
接口2难点在于返回任务状态
2.思路
做法体会:
1)第一次见md文档需求,看不懂。需要先理解md文档需求,明确输入输出内容;
2)json与数组与列表转换,很头大。没办法代码基础差,硬着头皮一个一个搜,一个一个试喽;
3)多线程这种真是第一次接触,以往只停留于理解概念,提问:线程与进程的区别?慢慢搜不着急,是调包的过程;
4)实际在写过程中,每次转换一次格式就开始print,可能过程是繁杂的,但是每次print让自己思路更加清晰。
# 总结
稳住心态慢慢写嘛,我基本是比着葫芦画瓢的过程,但是完成的那一刻还是蛮有成就感的,S小白加油!