服务器要部署一套算法, 我们的部署在该服务器上的数据平台需要调用 该算法进行一些操作,
要点主要两方面: 1.客户端发请求(同时传数据给服务). 2. 服务端的算法响应给请求,处理结束后,返回数据给客户端.这里一般第一次使用http协议的时候有点懵,其实是非常简单,我这里给了一个详细的例子,(因为我在网上看了很多资料,发现大多都是讲原理,或则例子不够详尽)
这就要考虑几个方面:
1.通信:
这里考虑用http的传输协议,因为这是短响应,并不是持续调用通信,flask框架是一个轻量化的web通信框架,所以我选择使用flask, 并使用post协议.
一般你要查一下机器上的ip地址
选择前两个的任意一个作为服务地址,比如选第二个127.0.0.1 . 端口可以任意,只要没有被占用即可,这里选9090
服务端通信部分的关键代码只有三个:
from flask import Flask,request
requestapp = Flask(__name__)
@app.route('/test', methods=['POST']) #/test可以任意设, 请求端保持一致即可
def xxxxx():
j_data= request.get_data()
xxxx=func_all(j_data)
return str(xxxx)
if __name__=="__main__":
app.run(host='127.0.0.1',port=9090, debug=False) 这就是开启服务的代码
2.算法部署
因为已经确定使用http传输协议,所以只要定好服务及端口地址就好,像调用一个普通函数一样来进行通信.,下面接受请求端的请求,并接受两个参数,求和后返回值(要字符串),一般最好是格式话的数据返回(比如json格式),方便请求端解析数据.
(1)python算法服务(server.py)
import json
def func_all(j_data):
data=json.loads(j_data)
para1= int(data["x1"])
para2=int(data["x2"])
print(para1,para2)
return str(para1+para2)
from flask import Flask, request
app = Flask(__name__)
@app.route('/test', methods=['POST'])
def just_test():
j_data= request.get_data()
final_result=func_all(j_data)
return str(final_result)
if __name__=="__main__":
app.run(host='127.0.0.1',port=9090, debug=False)
次服务开启后,就会如上方所示等待请求
每次请求端请求一次, 服务端会执行一下,如上
客户端请求部分:
import requests
import json
data = {'x1': '5', 'x2': '33'}
data_j = json.dumps(data)
r = requests.post("http://127.0.0.1:9090/test", data=data_j)
print (r.text)
按服务端给出的服务地址及端口,来进行请求,没请求一次会得到结果.
4. 开启自启动
如果是部署在服务器上,就需要考虑实际的使用的问题,所以需要服务端的算法一直在线运行,也就是要考虑服务器每次重启后的自启动问题。
在/etc/profile.d/文件夹下创建一个sh文件。里面的run_server.py就是
#!/bin/bash
python /home/xxx/run_server.py
其中run_server.py就是执行了server.py,这里考虑灵活性,所以加了run_server.py, run_server.py里面可以写入要执行的那些文件。这里仅执行一个server.py文件。
run_server.py文件如下:
import os
import subprocess
os.system("conda activate env_add") #这里为了切换到server的conda环境,如果不想切换环境,可以在默认的环境中增加如下的命令,就是安装需要的依赖库
#os.system("pip install flask")
subprocess.run(["python", "/home/xxxxx/server.py"])#根据需要可以增加需要执行的程序,这里只执行这一个脚本文件