说明
异步和同步处理混在一起比较容易出问题,干脆将异步的数据获取作为一个单独的服务接口。
对上次的例子进行一些改进,简化了脚手架部分的安装和拆除。
内容
1 基本IO
整个过程在jupyter中完成,首先建立一个空的文件夹,重命名。在文件夹下建立一个step1基本IO.ipynb
,在这里执行文件资源的导入。
2 开发
开发以dev开头,和项目的entry_py.py处在同一个文件夹,这样导入包函数比较简单,完成后不必再移动。
3 启动服务测试
- 1 查找镜像
- 2 启动容器
- 3 启动服务
docker run -it -p 20002:5555 -v YOURPATH:/opt 622d529d0fe7 bash
export ANDY_runenv="test"
python3 entry_py.py
4 开发主函数
通过func_dict会自动导入到funcs
- 异步获取api数据
import aiohttp
import asyncio
import json
import time
async def fetchx(x,url_template):
async with aiohttp.ClientSession() as session:
async with session.get(url_template % x) as response:
res = await response.text()
return {x:json.loads(res)}
async def async_query_main(doc_id_list, url_template, loop):
tasks = []
res = []
for doc_id in doc_id_list:
tasks.append(asyncio.ensure_future(fetchx(doc_id,url_template ),loop=loop))
await asyncio.wait(tasks)
for task in tasks:
res.append(task.result())
return res
# 在py文件中使用异步
def run_async_query(doc_id_list, query_template):
start = time.time()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop = asyncio.get_event_loop()
res = loop.run_until_complete(async_query_main(doc_id_list, query_template, loop))
loop.close()
print('Async Query Run Spending : {} s'.format(time.time() - start))
return res
5 修改视图函数
entry_py.py
的api函数
res_dict = {}
input_dict = request.get_json()
# 获取到的文档id列表
doc_id_list = input_dict['doc_id_list']
query_template = input_dict['query_template']
'''
Processing
'''
try:
res = fs.run_async_query(doc_id_list,query_template )
res_dict['status'] = True
res_dict['msg'] = 'ok'
res_dict['data'] = res
except:
res_dict['status'] = False
res_dict['msg'] = '获取任务失败'
res_dict['data'] = None
6 打包下载,解压上传
fs.zip_a_folder3('./SimpleAPI_v1', './SimpleAPI_v1_open_asyncget.zip',filter_file_list=['dev1.ipynb', 'dev2.ipynb'],fs=fs )
# 这个命令保存在sh_ 中
rsync -rvltz --progress "-e ssh -p xxxx" PATH/SimpleAPI_v1_open_asyncget/ user@IP:/opt/simaple_api_asyncget
7 在目标主机使用命令启动
如果没有镜像先执行拉取
调试状态,挂载文件夹并映射端口
docker run -it -p 20002:5555 -v /opt/simaple_api_asyncget:/opt 622d529d0fe7 bash
服务状态,设置开机重启,语言项(不然中文会有问题)
docker run -idt --restart=always -e "LANG=C.UTF-8" -p 20002:5555 -v /opt/simaple_api_asyncget:/opt 622d529d0fe7 sh -c "cd /opt && sh entry_sh.sh test"
8 测试内外网的连通性
内网
外网
只是测试一下。如果直接部署在公网服务器,打开端口就可以。如果是局域网机,还要做一下frp映射。
resp = req.post( 'http://DOMAIN:20002/api/', json=data)
print(resp.text)
- 1 m4git
- 2 在machine_config 下checkout分支
- 3 修改完frpc.ini 推送
- 4 在目标主机拉取
- 5 更新frpc.ini并重启