python grpc入门

准备

1.升级pip

$ python -m pip install --upgrade pip

2.安装grpc

$ python -m pip install grpcio

3.安装grpc tools

$ python -m pip install grpcio-tools

4.下载example

$ # Clone the repository to get the example code:
$ git clone https://github.com/grpc/grpc
$ # Navigate to the "hello, world" Python example:
$ cd grpc/examples/python/helloworld

运行一个简单的CS demo

Terminal A:

$ python greeter_server.py

Terminal B:

$ python greeter_client.py

greeter_server.py:

# Copyright 2015, Google Inc.
# All rights reserved.
# ..."""The Python implementation of the GRPC helloworld.Greeter server."""from concurrent import futures
import timeimport grpcimport helloworld_pb2
import helloworld_pb2_grpc_ONE_DAY_IN_SECONDS = 60 * 60 * 24class Greeter(helloworld_pb2_grpc.GreeterServicer):def SayHello(self, request, context):return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)def serve():server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)server.add_insecure_port('[::]:50051')server.start()try:while True:time.sleep(_ONE_DAY_IN_SECONDS)except KeyboardInterrupt:server.stop(0)if __name__ == '__main__':serve()

greeter_client.py:

# Copyright 2015, Google Inc.
# All rights reserved.
# ... """The Python implementation of the GRPC helloworld.Greeter client."""from __future__ import print_functionimport grpcimport helloworld_pb2
import helloworld_pb2_grpcdef run():channel = grpc.insecure_channel('localhost:50051')stub = helloworld_pb2_grpc.GreeterStub(channel)response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))print("Greeter client received: " + response.message)if __name__ == '__main__':run()

结果,客户端显示:

root@ubuntu:/home/wasdns/grpc/examples/python/helloworld# python greeter_client.py 
Greeter client received: Hello, you!

Make a Difference

1.本例的*.proto文件:

// Copyright 2015, Google Inc.
// All rights reserved.
// ...syntax = "proto3";option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";package helloworld;// The greeting service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request message containing the user's name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}

将其修改为:

syntax = "proto3";option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";package helloworld;// The greeting service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}// Say Hello Againrpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}// The request message containing the user's name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}

2.在examples/python/helloworld目录下,执行:

$ python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto

该命令生成两个文件:包含请求和回复类定义的helloworld_pb2.py 和 包含客户端和服务端类定义的helloworld_pb2_grpc.py

3.更新并运行demo:

greeter_server.py中的内容修改为:

class Greeter(helloworld_pb2_grpc.GreeterServicer):def SayHello(self, request, context):return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)def SayHelloAgain(self, request, context):return helloworld_pb2.HelloReply(message='Hello again, %s!' % request.name)

greeter_client.py中的内容修改为:

def run():channel = grpc.insecure_channel('localhost:50051')stub = helloworld_pb2_grpc.GreeterStub(channel)response = stub.SayHello(helloworld_pb2.HelloRequest(name='wasdns'))print("Greeter client received: " + response.message)response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(name='wasdns'))print("Greeter client received: " + response.message)

运行:

root@ubuntu:/home/wasdns/grpc/examples/python/helloworld# python greeter_client.py 
Greeter client received: Hello, wasdns!
Greeter client received: Hello Again, wasdns!

Appendix

helloworld_pb2.py:

# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: helloworld.protoimport sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)_sym_db = _symbol_database.Default()DESCRIPTOR = _descriptor.FileDescriptor(name='helloworld.proto',package='helloworld',syntax='proto3',serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2\x8e\x01\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x12\x43\n\rSayHelloAgain\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3')
)
_sym_db.RegisterFileDescriptor(DESCRIPTOR)_HELLOREQUEST = _descriptor.Descriptor(name='HelloRequest',full_name='helloworld.HelloRequest',filename=None,file=DESCRIPTOR,containing_type=None,fields=[_descriptor.FieldDescriptor(name='name', full_name='helloworld.HelloRequest.name', index=0,number=1, type=9, cpp_type=9, label=1,has_default_value=False, default_value=_b("").decode('utf-8'),message_type=None, enum_type=None, containing_type=None,is_extension=False, extension_scope=None,options=None),],extensions=[],nested_types=[],enum_types=[],options=None,is_extendable=False,syntax='proto3',extension_ranges=[],oneofs=[],serialized_start=32,serialized_end=60,
)_HELLOREPLY = _descriptor.Descriptor(name='HelloReply',full_name='helloworld.HelloReply',filename=None,file=DESCRIPTOR,containing_type=None,fields=[_descriptor.FieldDescriptor(name='message', full_name='helloworld.HelloReply.message', index=0,number=1, type=9, cpp_type=9, label=1,has_default_value=False, default_value=_b("").decode('utf-8'),message_type=None, enum_type=None, containing_type=None,is_extension=False, extension_scope=None,options=None),],extensions=[],nested_types=[],enum_types=[],options=None,is_extendable=False,syntax='proto3',extension_ranges=[],oneofs=[],serialized_start=62,serialized_end=91,
)DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST
DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLYHelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict(DESCRIPTOR = _HELLOREQUEST,__module__ = 'helloworld_pb2'# @@protoc_insertion_point(class_scope:helloworld.HelloRequest)))
_sym_db.RegisterMessage(HelloRequest)HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict(DESCRIPTOR = _HELLOREPLY,__module__ = 'helloworld_pb2'# @@protoc_insertion_point(class_scope:helloworld.HelloReply)))
_sym_db.RegisterMessage(HelloReply)DESCRIPTOR.has_options = True
DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW'))
try:# THESE ELEMENTS WILL BE DEPRECATED.# Please use the generated *_pb2_grpc.py files instead.import grpcfrom grpc.beta import implementations as beta_implementationsfrom grpc.beta import interfaces as beta_interfacesfrom grpc.framework.common import cardinalityfrom grpc.framework.interfaces.face import utilities as face_utilitiesclass GreeterStub(object):"""The greeting service definition."""def __init__(self, channel):"""Constructor.Args:channel: A grpc.Channel."""self.SayHello = channel.unary_unary('/helloworld.Greeter/SayHello',request_serializer=HelloRequest.SerializeToString,response_deserializer=HelloReply.FromString,)self.SayHelloAgain = channel.unary_unary('/helloworld.Greeter/SayHelloAgain',request_serializer=HelloRequest.SerializeToString,response_deserializer=HelloReply.FromString,)class GreeterServicer(object):"""The greeting service definition."""def SayHello(self, request, context):"""Sends a greeting"""context.set_code(grpc.StatusCode.UNIMPLEMENTED)context.set_details('Method not implemented!')raise NotImplementedError('Method not implemented!')def SayHelloAgain(self, request, context):"""Say Hello Again"""context.set_code(grpc.StatusCode.UNIMPLEMENTED)context.set_details('Method not implemented!')raise NotImplementedError('Method not implemented!')def add_GreeterServicer_to_server(servicer, server):rpc_method_handlers = {'SayHello': grpc.unary_unary_rpc_method_handler(servicer.SayHello,request_deserializer=HelloRequest.FromString,response_serializer=HelloReply.SerializeToString,),'SayHelloAgain': grpc.unary_unary_rpc_method_handler(servicer.SayHelloAgain,request_deserializer=HelloRequest.FromString,response_serializer=HelloReply.SerializeToString,),}generic_handler = grpc.method_handlers_generic_handler('helloworld.Greeter', rpc_method_handlers)server.add_generic_rpc_handlers((generic_handler,))class BetaGreeterServicer(object):"""The Beta API is deprecated for 0.15.0 and later.It is recommended to use the GA API (classes and functions in thisfile not marked beta) for all further purposes. This class was generatedonly to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""""""The greeting service definition."""def SayHello(self, request, context):"""Sends a greeting"""context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)def SayHelloAgain(self, request, context):"""Say Hello Again"""context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)class BetaGreeterStub(object):"""The Beta API is deprecated for 0.15.0 and later.It is recommended to use the GA API (classes and functions in thisfile not marked beta) for all further purposes. This class was generatedonly to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""""""The greeting service definition."""def SayHello(self, request, timeout, metadata=None, with_call=False, protocol_options=None):"""Sends a greeting"""raise NotImplementedError()SayHello.future = Nonedef SayHelloAgain(self, request, timeout, metadata=None, with_call=False, protocol_options=None):"""Say Hello Again"""raise NotImplementedError()SayHelloAgain.future = Nonedef beta_create_Greeter_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):"""The Beta API is deprecated for 0.15.0 and later.It is recommended to use the GA API (classes and functions in thisfile not marked beta) for all further purposes. This function wasgenerated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""request_deserializers = {('helloworld.Greeter', 'SayHello'): HelloRequest.FromString,('helloworld.Greeter', 'SayHelloAgain'): HelloRequest.FromString,}response_serializers = {('helloworld.Greeter', 'SayHello'): HelloReply.SerializeToString,('helloworld.Greeter', 'SayHelloAgain'): HelloReply.SerializeToString,}method_implementations = {('helloworld.Greeter', 'SayHello'): face_utilities.unary_unary_inline(servicer.SayHello),('helloworld.Greeter', 'SayHelloAgain'): face_utilities.unary_unary_inline(servicer.SayHelloAgain),}server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)return beta_implementations.server(method_implementations, options=server_options)def beta_create_Greeter_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):"""The Beta API is deprecated for 0.15.0 and later.It is recommended to use the GA API (classes and functions in thisfile not marked beta) for all further purposes. This function wasgenerated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""request_serializers = {('helloworld.Greeter', 'SayHello'): HelloRequest.SerializeToString,('helloworld.Greeter', 'SayHelloAgain'): HelloRequest.SerializeToString,}response_deserializers = {('helloworld.Greeter', 'SayHello'): HelloReply.FromString,('helloworld.Greeter', 'SayHelloAgain'): HelloReply.FromString,}cardinalities = {'SayHello': cardinality.Cardinality.UNARY_UNARY,'SayHelloAgain': cardinality.Cardinality.UNARY_UNARY,}stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)return beta_implementations.dynamic_stub(channel, 'helloworld.Greeter', cardinalities, options=stub_options)
except ImportError:pass
# @@protoc_insertion_point(module_scope)

helloworld_pb2_grpc.py:

# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
import grpcimport helloworld_pb2 as helloworld__pb2class GreeterStub(object):"""The greeting service definition."""def __init__(self, channel):"""Constructor.Args:channel: A grpc.Channel."""self.SayHello = channel.unary_unary('/helloworld.Greeter/SayHello',request_serializer=helloworld__pb2.HelloRequest.SerializeToString,response_deserializer=helloworld__pb2.HelloReply.FromString,)self.SayHelloAgain = channel.unary_unary('/helloworld.Greeter/SayHelloAgain',request_serializer=helloworld__pb2.HelloRequest.SerializeToString,response_deserializer=helloworld__pb2.HelloReply.FromString,)class GreeterServicer(object):"""The greeting service definition."""def SayHello(self, request, context):"""Sends a greeting"""context.set_code(grpc.StatusCode.UNIMPLEMENTED)context.set_details('Method not implemented!')raise NotImplementedError('Method not implemented!')def SayHelloAgain(self, request, context):"""Say Hello Again"""context.set_code(grpc.StatusCode.UNIMPLEMENTED)context.set_details('Method not implemented!')raise NotImplementedError('Method not implemented!')def add_GreeterServicer_to_server(servicer, server):rpc_method_handlers = {'SayHello': grpc.unary_unary_rpc_method_handler(servicer.SayHello,request_deserializer=helloworld__pb2.HelloRequest.FromString,response_serializer=helloworld__pb2.HelloReply.SerializeToString,),'SayHelloAgain': grpc.unary_unary_rpc_method_handler(servicer.SayHelloAgain,request_deserializer=helloworld__pb2.HelloRequest.FromString,response_serializer=helloworld__pb2.HelloReply.SerializeToString,),}generic_handler = grpc.method_handlers_generic_handler('helloworld.Greeter', rpc_method_handlers)server.add_generic_rpc_handlers((generic_handler,))

转载自https://www.cnblogs.com/qq952693358/p/6942354.html 

grpc源码解析:https://www.cnblogs.com/wxlevel/p/9154246.html#auto_id_6

https://www.cnblogs.com/wxlevel/p/9154434.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【债券】可转换债券基本概念

可转换债券是可转换公司债券的简称&#xff0c;又简称可转债&#xff0c;是一种可以在特定时间、按特定条件转换为普通股票的特殊企业债券。可转换债券兼具债权和期权的特征。 可转债重要概念 正股价格&#xff1a;债券对应的股票的交易价格&#xff1b;转股价&#xff1a;以…

grpc例子

什么是RPC RPC&#xff08;Remote Procedure Call Protocol&#xff09;-- 远程过程调用协议&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络协议的协议。RPC协议假定某些传输协议的存在&#xff0c;如TCP或UDP&#xff0c;为通信程序…

【股票】融资融券基本概念

融资融券交易(securities margin trading)又称“证券信用交易”或保证金交易&#xff0c;2008年4月23日国务院颁布的《证券公司监督管理条例》对融资融券做了如下定义&#xff1a;融资融券业务&#xff0c;是指在证券交易所或者国务院批准的其他证券交易场所进行的证券交易中&a…

python 字符串中特定字符替换,截取

特定字符串替换 t2018-08-07 t1t.replace(-,) print(t1) #输出为20180807 字符串截取与拼接 pathE:/项目/Djangocode/RSMDSys/static/imagedata/1535974092.287188.jpg path1path.split(/) print(path1:,path1) path2path.split(/,4) print(path2:,path2) print(type(path2…

【性能测试】性能测试的基础理论

转发自博客园贺满&#xff1a;https://www.cnblogs.com/puresoul/p/5456855.html &#xff0c;有删减。 随着软件行业的快速发展&#xff0c;现代的软件系统越来越复杂&#xff0c;功能越来越多&#xff0c;测试人员除了需要保证基本的功能测试质量&#xff0c;性能也随越来越受…

MySQL 处理插入重主键唯一键重复值办法

本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法&#xff0c;主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE&#xff1b;接下来就分别看看这三种方式的处理办法。 IGNORE 当使用INSERT语句向表中添加一些行数据并且在处理期间发生错误时&#xff0c;…

【性能测试】性能测试的基本流程

转发自博客园贺满&#xff1a;https://www.cnblogs.com/puresoul/p/5463477.html&#xff0c;有删减。 本文主要介绍下性能测试的基本流程&#xff0c;性能测试从实际执行层面来看&#xff0c;测试的过程一般分为这么几个阶段&#xff0c;如下图&#xff1a; 下面分别介绍下每个…

python logging模块学习

python 的日志logging模块学习 1.简单的将日志打印到屏幕 import logging logging.debug(This is debug message) logging.info(This is info message) logging.warning(This is warning message) 屏幕上打印: WARNING:root:This is warning message 默认情况下&#xff0c;…

【性能测试】性能测试工具选择

转发自博客园贺满&#xff1a;https://www.cnblogs.com/puresoul/p/5503134.html&#xff0c;有删减。 本篇文章主要简单总结下性能测试工具的原理以及如何选型。性能测试和功能测试不同&#xff0c;性能测试的执行是基本功能的重复和并发&#xff0c;需要模拟多用户&#xff0…

python 将图片与字符串相互转换

import base64 image1.jpg#将图片encode为二进制字符串方法一 with open(image,rb) as f:strbase64.b64encode(f.read()) print(type(str))#将图片encode为二进制字符串方法二 fopen(image,rb) f_strbase64.b64encode(f.read()) f.close() print(type(f_str))#将二进制字符串&a…

【测试工具】禅道项目管理工具设置触发邮箱

禅道支持邮件提醒&#xff0c;当需求、任务、bug等发生变化的时候&#xff0c;可以发邮件提醒。 禅道提醒邮件默认通知范围&#xff08;禅道9.8版本&#xff0c;可以在 后台-消息-设置中设置哪些动作需要发信&#xff09;&#xff1a; 1、Bug&#xff1a;指派给抄送 添加&#…

python文件地址拼接

方法一&#xff1a; jmeter_config os.path.join(os.getcwd(), rconf/config.jmx)#运行结果 #E:\项目\gRPC\test #E:\项目\gRPC\test\conf/config.jmx 方法二&#xff1a; file_address "./fileimage/" image r".jpg" print(file_address) #运行结果…

【性能测试】Linux系统监控-Top命令

前面转载的三篇文章主要介绍了性能测试的相关概念&#xff0c;其中有提到服务器&#xff0c;服务器的配置是性能测试中必须考虑的&#xff0c;而且性能测试中也必须监控服务器。 这篇文章主要介绍一下如何通过Linux服务器自带的top命令监控运行情况&#xff0c;以下是直接top命…

【性能测试】Linux系统监控-CPU信息

我们知道CPU对于服务器来说非常重要&#xff0c;下面我们从几个方面介绍linux服务器CPU相关信息&#xff1a; 先要理解以下几个概念&#xff1a; 1、一台物理机的物理CPU的个数 2、一个CPU上的核数 3、一个核上面支持的线程数 有下面的计算公式&#xff1a; 总核数 物理C…

python json文件传输图片

第一步、将图片转为str image1.jpg print(type(image)) def imageToStr(image):with open(image,rb) as f:image_bytebase64.b64encode(f.read())print(type(image_byte))image_strimage_byte.decode(ascii) #byte类型转换为strprint(type(image_str))return image_str image1…

python时间time模块介绍

先看几个概念&#xff1a; 时间戳&#xff1a;从1970年1月1日00:00:00开始按秒计算的偏移量。举个例子&#xff0c;现在是2017年6月11的下午16:54:32&#xff0c;那么print(time.time())输出的值是1497171320.99就代表现在的时间戳。 元组&#xff08;struct_time&#xff09;…

【Linux】Linux简介以及 与UNIX区别

一直以来对Linux、Unix、linux内核、linux发行版的概念比较模糊&#xff0c;最近查找资料并经过自己的整理&#xff0c;主要总结了Linux和UNIX的区别和联系、内核和操作系统的关系、Linux操作系统和结构、发行版本CentOS介绍。 Linux 和 UNIX 的关系/区别 Linux 是一个类似 U…

python 数据库查询返回list或tuple

MySQLdb默认查询结果都是返回tuple&#xff0c;输出时候不是很方便&#xff0c;必须按照0&#xff0c;1这样读取&#xff0c;无意中在网上找到简单的修改方法&#xff0c;就是传递一个cursors.DictCursor就行。 默认程序&#xff1a; import MySQLdb db MySQLdb.connect(ho…

【视频】视频文件格式和视频编码

我们经常在电脑、电视、手机或者其他终端产品看视频&#xff0c;我们对视频有个大概了解&#xff0c;比如清晰度、大小、视频类型等&#xff0c;但是对于视频内部结构我们应该一无所知&#xff0c;现在我们来一步一步解开视频的神秘面纱。 首先大家要清楚两个概念&#xff0c;视…

python list,str的拼接与转换

一、str转换为list <list> <str>.split(<separator>) <str>: 需要进行分隔提取的字符串 <separator>&#xff1a;从<str2>提取元素时依据的分隔符&#xff0c;一般也是一个str类型&#xff0c;如, <list>: 返回值&#xff0c;lis…