网站数据库是谁提供知名企业营销案例100例
web/
2025/9/27 14:13:35/
文章来源:
网站数据库是谁提供,知名企业营销案例100例,线上营销推广方案有哪些,购物网站php模板文章目录1. gRPC#xff08;google Remote Procedure Call#xff09; 技术 —— 高效性地跨平台、跨语言开发2. 基于 python 实现 gRPC 框架2.1 一个 gPRC 项目必须包含的几大部分2.2 helloworld.proto 文件——定义全局可调用函数及其参数数据结构2.3 server.py 文件——实…
文章目录1. gRPCgoogle Remote Procedure Call 技术 —— 高效性地跨平台、跨语言开发2. 基于 python 实现 gRPC 框架2.1 一个 gPRC 项目必须包含的几大部分2.2 helloworld.proto 文件——定义全局可调用函数及其参数数据结构2.3 server.py 文件——实现服务器端的全局可调用函数2.4 client.py 文件——调用在服务器代码中实现的全局函数2.5 运行结果3. 基于gRPC技术搭建一个简单的Agent学习系统相信不少人在做项目开发的时候都会遇到这样的问题一套系统中不同部分的代码会部署在多个不同的设备平台上多个平台间需要保证数据相连。对于分布式部署的系统来说高效的通信直接决定了整个系统的性能。此外由于平台的多样性不同平台上所适合的编程语言也可能有所差异如c、python、objective-c等。为此一门支持“跨平台”、“跨语言”的技术对于一个分布式部署的系统来说显得尤为重要。
1. gRPCgoogle Remote Procedure Call 技术 —— 高效性地跨平台、跨语言开发
为了解决上述问题google设计了一种远程系统调用技术其将多个不同设备平台视为一个整体保证了在一个设备上的代码能够对另一个设备上代码中的函数进行访问和调用实现了多个平台之间的数据交互且各设备间不需要约定使用同一种编程语言这就是gRPC技术。例如在服务器机器上使用c实现好的函数在客户端终端设备上可以直接使用Ruby调用在另外一台客户端机器上也可以直接使用Android调用很好的保证了“跨语言、跨平台”的开发流程。 要想实现跨平台的代码调用就必然涉及到平台间的数据通信问题数据通信效率成为了系统性能的一个重要指标。gRPC基于protobuf设计了数据互通协议保证了数据传输时的高效性和快速性。Protocol Buffers是一种数据格式与XML、JSON类似但比JSON和XML更加的高效和快速在一些高性能且对响应速度有要求的数据传输场景非常适用。在使用JSON进行数据编译时为了保证数据的易读性JSON是以文本的形式存储和传输的这样一来导致进行数据交换时设备需要耗费大量的CPU在I/O动作上从而影响整个传输速率。而protobuf不同于JSON它会将字符串都进行序列化后再进行传输即传输的是二进制数据此外protobuf是基于数字tag来标识各内容而JSON则是以字符串来标识各内容的因此protobuf在传输速率方面有着天然的优势。
// protobuf 基于数字来确定内容段
message Person {required string name 1;required int32 age 2;required string gender 3;
}// Json 基于字符串来确定内容段
{name : Wang DaChui,age : 18,gender : Male
}2. 基于 python 实现 gRPC 框架
如上一节中的图片中所示我们可以利用gRPC框架实现不同平台上的代码之间相互调用这一节中我们通过分别编写“服务器”和“客户端”这两个不同平台的代码来实现在客户端代码中调用服务器代码中的函数。为了编写方便我们将服务器和客户端代码存放在同一个机器上的不同位置等最后部署的时候再将代码分别部署到对应的设备平台上。
2.1 一个 gPRC 项目必须包含的几大部分
下图是一个最简单的 gRPC 项目需要包含的文件我们先来看看这些文件分别有什么用 helloworld.proto该文件的作用是“定义服务器函数” “定义函数参数的数据类型”。helloworld_pb2.py 和 helloworld_pb2_grpc.py 这两个文件是由python的grpc_tools根据helloworld.proto文件自动生成的这两个文件保证了客户端能够调用服务器端的函数不用修改。server.py服务器设备平台1上的代码。client.py客户端设备平台2上的代码。
上述4个部分是一个最简单的grpc项目所包含的文件接下来我们依次实现每一个部分中代码搭建一个简单的grpc项目使得我们能够在client.py代码中调用server.py中定义的函数。这里可能有人会有疑问如果要让client.py能调用server.py中的函数那直接把server.py写成一个类再在client.py中import server不就好了吗需要注意的是在最终部署的时候server.py和client.py是会部署在不同的机器上的那时候client.py的机器上是找不到server.py代码文件的这里只是为了方便开发和讲解才把这两个文件放在同一个机器上。
2.2 helloworld.proto 文件——定义全局可调用函数及其参数数据结构
.proto文件中需要定义服务器中需要实现的全局可调用函数以及这个函数的参数数据结构由于我们想在服务器上实现一个客户端可以直接调用的加法器那么在.proto文件中我们就需要明确定义这个“加法函数”以及“加法函数”所接收的参数类型和返回值类型helloworld.proto文件内容如下:
syntax proto3;service Adder{// 将全局可调用函数AddNumber在这里声明第一个括号内是传入参数第二个括号是返回值参数rpc AddNumber(AddRequest) returns (AddResponse) {}
}// 对全局函数AddNumber的输入参数AddRequest进行数据格式定义
message AddRequest{int32 Number1 1;int32 Number2 2;
}// 对全局函数AddNumber的返回值参数AddResponse进行数据格式定义
message AddResponse{string ResultString 1;
}编写完成后保存文件在Terminal中运行
python -m grpc_tools.protoc -I. --python_out. --grpc_python_out. ./helloworld.proto运行成功后会在当前目录生成两个文件helloworld_pb2.py 和 helloworld_pb2_grpc.py。
–python_out该参数指定了helloworld_pb2.py文件的生成路径。–grpc_python_out该参数指定了helloworld_pb2_grpc.py文件的生成路径。-I该参数指定了.proto文件的存放路径。./helloworld.proto.proto文件的文件名。
2.3 server.py 文件——实现服务器端的全局可调用函数
server.py文件用于实现在.proto文件中声明的那些全局可调用函数例如我们在helloworld.proto文件中声明了一个AddNumber()函数那么我们就需要在server.py文件中去亲自实现这个函数server.py文件内容如下
from concurrent import futures
import loggingimport grpcimport helloworld_pb2
import helloworld_pb2_grpc对应.proto文件中的service Adder类
class Adder(helloworld_pb2_grpc.AdderServicer):实现.proto文件中的AdderNumber函数这里request参数类型和.proto文件中AddRequest类型一样def AddNumber(self, request, context):保证该函数的返回值和.proto文件中定义的AddResponse返回值类型一样return helloworld_pb2.AddResponse(ResultStringResult: %d % (request.Number1 request.Number2))def serve():server grpc.server(futures.ThreadPoolExecutor(max_workers10))helloworld_pb2_grpc.add_AdderServicer_to_server(Adder(), server)server.add_insecure_port([::]:50051)server.start()server.wait_for_termination()if __name__ __main__:logging.basicConfig()serve() 在这个文件中最重要的部分就是Adder这个类这个类是对.proto文件中的service Adder的实现因此在.proto中service部分里定义的函数在这个Adder class中都必须要实现。AddNumber(self, request, context)函数就是其对应的实现第二个参数request的类型和.proto中定义的AddRequest类型是一样的这个request参数是在客户端调用这个函数时需要传入的因此可以直接通过request.Number1 和 request.Number2来直接访问这两个整型数据。最后在函数返回的时候必须要保证值也是.proto中定义的返回值类型最好的办法就是直接返回.proto文件中的这个对象只是修改这个对象中的值ResultString即可。
2.4 client.py 文件——调用在服务器代码中实现的全局函数
当我们实现好了server.py中的函数后我们就可以在客户端代码中调用这个全局函数了在这里我们在client.py代码中去调用server.py代码中实现的Adder()函数client.py的内容如下
import loggingimport grpcimport helloworld_pb2
import helloworld_pb2_grpcdef run():建立通信管道with grpc.insecure_channel(localhost:50051) as channel:建立一个stub对象通过这个对象我们就可以调用服务器端的函数了stub helloworld_pb2_grpc.AdderStub(channel)调用stub.AddNumber()函数要保证传入参数是.proto文件中的AddRequest对象response stub.AddNumber(helloworld_pb2.AddRequest(Number11, Number22))print(response)if __name__ __main__:logging.basicConfigrun()
在客户端代码中首先要建立一个stub对象该对象就是远程服务器对象我们通过stub对象就可以访问远程服务器上实现的全部函数了。要注意的是在传入参数里必须要和.proto文件中的传入对象完全保持一致最好的办法还是传入一个.proto文件中所声明的对象只是修改其中的值便可。
2.5 运行结果
依次在两个不同的Terminal中先后运行server.py和client.py在client端的运行环境中看到成功调用了server端中的AddNumber()函数 3. 基于gRPC技术搭建一个简单的Agent学习系统
使用gRPC技术可以方便的设计一个Agent学习系统即仿真端负责仿真环境的数据计算算法端负责Agent行为决策。我使用gRPC技术搭建了一个简单的机器人找钻石的学习系统github地址这里。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81098.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!