首页 > 编程语言 >gprc python调用c++远程服务

gprc python调用c++远程服务

时间:2023-06-08 23:35:00浏览次数:41  
标签:python c++ 生成 gprc grpc rpc 服务端 客户端

 

 客户端和服务端之间不是直接通信的,需要通过生成的代码和protocol buffers传输协议(可使用其他传输协议替换)进行通信。

开发步骤:

 

 

1. .proto文件----message和service

message是消息类型,定义参数,service是接口类型,定义远程服务的方法

在grpc中有四种类型的服务方法:参考

1.简单rpc,即一元消息:客户端向服务端发送一个请求,服务端响应,类似普通的函数调用 

rpc SimpleRPC(HelloRequest) returns (HelloResponse);

2.服务端流式rpc:客户端向服务端发送一个请求,服务端返回一个流。客户端可以从这个流中读取,直到服务端关闭这个流。

rpc ServerSideStreamingRPC(HelloRequest) returns (stream HelloResponse);

流式传输方式就是不将数据一次性传输完,数据被划分为小块传输,每个小块传输完后可以立即处理,减少等待时间,提高传输效率,但是可靠性可能会降低。】

3.客户端流式rpc:客户端向服务端发起流式请求,客户端可以多次向流中写入数据,服务端从流中多次读取数据直到客户端关闭流。服务端处理完所有数据后,向客户端返回普通响应。

rpc ClientSideStreamingRPC(stream HelloRequest) returns (HelloResponse);

4.双向流式rpc:客户端发起流式请求,服务端返回流式响应。两个流相互独立,互不影响。

rpc BidrectionalStreamingRPC(stream HelloRequest) returns (stream HelloResponse);

 

编写.proto代码后,运行下面的两个命令分别生成两个py文件,.cc和.h文件

python需要安装grpcio模块和grpcio-tools工具,直接用pip安装即可

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. example.proto
protoc -I ./ --grpc_out=./ --plugin=protoc-gen-grpc=./grpc/cmake/build/grpc_cpp_plugin ./example.proto    //自动生成example.grpc.pb.cc和example.grpc.pb.h文件

 生成的代码中

namespac::grpc::service是grpc c++库的一个基类,用于定义grpc服务的接口,它是一个抽象类为派生类提供了处理grpc请求的能力。

::grpc::service中定义了一组虚函数用来处理特定服务中定义的rpc方法,这些虚函数应该在派生类中被实现以处理客户端请求并生成响应。

 

2.使用简单rpc编写客户端python代码和服务端c++代码

 简单编写后遇到以下问题:当前还没解决

 

简单编写客户端代码后,思考一个问题,由于客户端处理的是多维数据,传递给服务端的矩阵形状为[L, P, P, B],以及一个数组np.array([L, P, P, B]),c++服务端返回给客户端的矩阵形状是[B, B]。python传递的是numpy数组,c++端怎样接收。

 

 

对于服务端代码,在.grpc.pb.h中找到自动生成的服务类的虚函数,新建一个cpp文件,其中继承该类并实现其中的虚函数。

 

遇到的问题记录:

在简单编写服务端代码后,进行编译和链接,编译无问题(gcc -c server.cpp 执行后生成了server.o目标文件),链接阶段出现了很多undefined reference to...的问题。可能是没有找到需要链接的库,关于这一方面我其实现在不是特别清楚为什么它找不到需要链接的库。

 

grpc在编译和安装后会生成哪些文件,分别位于什么位置?

会生成grpc插件文件:这些文件用于根据.proto文件完成客户端和服务端代码的生成,例如grpc_cpp_plugin等,

编译生成的库文件:编译和安装过程将生成静态库文件和动态库文件,用于在应用程序中链接和使用grpc,通常生成的库文件会被安装到系统库目录或指定目录中。我系统上安装到了/usr/local/include/grpc下面。

通过在网上找相关问题,可能是RTTI和no-RTTI同时存在的问题,对于这个可以问题可以看这篇博客,另外,这篇是个人学习记录

标签:python,c++,生成,gprc,grpc,rpc,服务端,客户端
From: https://www.cnblogs.com/yz-lucky77/p/17444125.html

相关文章

  • python爬虫学习记录
    浏览器工具web请求过程http协议数据解析目的提取有效的数据信息四种解析方式re解析:正则表达式解析,效率特别高bs4解析:老项目的解析方式xpath解析:高级,简单方便速度快pyquery解析:模仿前端的jQuery函数库的解析方式正则表达式RegularExpression一种使用表达式对字符......
  • 【Python查漏补缺(一)】闭包和装饰器
    闭包的构成条件:在函数嵌套(函数里面再定义函数)的前提下内部函数使用了外部函数的变量(还包括外部函数的参数)外部函数返回了内部函数简单闭包deffun_out(num1):  #定义外部函数  deffun_inner(num2):    #内部函数使用了外部函数的变量  ......
  • 【Python查漏补缺(二)】正则表达式与深浅拷贝
    在开始正题之前讲一下打开文件的另一种方式。之前打开文件的方式f=open("文件路径","文件打开方式",encoding="utf8")模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开......
  • 【视频】Python的天气数据爬虫实时抓取采集和可视化展示
    全文链接:http://tecdat.cn/?p=32715原文出处:拓端数据部落公众号分析师:XiaoyangZhou本文以天气数据实时抓取和可视化展示为主题,旨在探讨如何使用Python编写程序来实现对天气数据的抓取、可视化和预测。从中国气象局天气预报网来获取数据首先,我们需要从中国气象局天气预报网上......
  • python爬虫——爬取网易云音乐评论内容
    一、选题背景  随着互联网的快速发展,网络上的评论文本资源急速增长。面对海量的网络资源信息,如何运用python爬虫技术爬取数据进行数据分析,挖掘评论文本中蕴含的丰富价值。二、大数据分析设计方案1.爬虫网站https://music.163.com/?from=wsdh#/song?id=2052441038 ......
  • 实验6turtle绘图与python库应用编程体验
    实验任务1test1实验代码fromturtleimport*defmove(x,y):penup()goto(x,y)pendown()defdraw(n,size=100):foriinrange(n):fd(size)left(360/n)defmain():pensize(2)pencolor('red')move(-200,0)......
  • Python取整及四舍五入
    向上取整:math.ceil()importmathmath.ceil(-0.9)>>>0math.ceil(0.3)>>>1向下取整:math.floor()、int()、//(整除)math.floor(-0.3)>>>-1int(0.9)>>>03//2#1.5>>>1虚假的四舍五入:round()""&quo......
  • 14dayPythonTask7-类与对象+魔法函数
    目录类与对象1.对象=属性+方法2.self是什么?3.Python的魔法方法4.公有和私有5.继承6.组合7.类、类对象和实例对象8.什么是绑定?9.一些相关的内置函数(BIF)练习题魔法方法1.基本的魔法方法2.算术运算符3.反算术运算符4.增量赋值运算符5.一元运算符6.属性访问7.描......
  • 【python】lambda
    lambdalambda是匿名函数,也就是没有名字的函数。lambda的语法非常简单:下面是一个lambda表达式的简单例子,我们可以把lambda表达式赋值给一个变量,然后通过这个变量来使用它:>>>my_sum=lambdax,y:x+y>>>my_sum(1,2)3lambda默认参数详解语法lambda[parameter_list,p......
  • python常用函数(zip,map,filter,reduce)
    一、zip它是Python的内建函数,(与序列有关的内建函数有:sorted()、reversed()、enumerate()、zip()),其中sorted()和zip()返回一个序列(列表)对象,reversed()、enumerate()返回一个迭代器(类似序列)>>>name=('jack','man','sony','pcky')>>>age=(2001,2003,2005,......