博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
grpc python quickstart
阅读量:4543 次
发布时间:2019-06-08

本文共 15784 字,大约阅读时间需要 52 分钟。

参考:

准备

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 futuresimport timeimport grpcimport helloworld_pb2import 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_pb2import 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 greeting  rpc SayHello (HelloRequest) returns (HelloReply) {}}// The request message containing the user's name.message HelloRequest {  string name = 1;}// The response message containing the greetingsmessage 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 greeting  rpc SayHello (HelloRequest) returns (HelloReply) {}  // Say Hello Again  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}}// The request message containing the user's name.message HelloRequest {  string name = 1;}// The response message containing the greetingsmessage 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 _descriptorfrom google.protobuf import message as _messagefrom google.protobuf import reflection as _reflectionfrom google.protobuf import symbol_database as _symbol_databasefrom 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'] = _HELLOREQUESTDESCRIPTOR.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 = TrueDESCRIPTOR._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 grpc  from grpc.beta import implementations as beta_implementations  from grpc.beta import interfaces as beta_interfaces  from grpc.framework.common import cardinality  from grpc.framework.interfaces.face import utilities as face_utilities  class 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 this    file not marked beta) for all further purposes. This class was generated    only 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 this    file not marked beta) for all further purposes. This class was generated    only 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 = None    def SayHelloAgain(self, request, timeout, metadata=None, with_call=False, protocol_options=None):      """Say Hello Again      """      raise NotImplementedError()    SayHelloAgain.future = None  def 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 this    file not marked beta) for all further purposes. This function was    generated 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 this    file not marked beta) for all further purposes. This function was    generated 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,))

2017.6.5

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

你可能感兴趣的文章
51Nod 1181 质数中的质数(质数筛法)
查看>>
并发编程学习总结
查看>>
Xamarin.Android 上中下布局
查看>>
VS Code使用记录
查看>>
locust参数化(数据库取值)
查看>>
Google Protocol Buffers浅析(三)
查看>>
.net core 中使用Google的protoc
查看>>
Spring Cloud和Spring Boot的区别
查看>>
jquery实现图片上传前本地预览
查看>>
C# — 题库答案汇总
查看>>
docker居然需要3.10以上的内核
查看>>
Win10下安装zookeeper
查看>>
客户端用JavaScript填充DropDownList控件,服务器端读不到值
查看>>
Dubbo源码学习--服务是如何引用的
查看>>
【转】C#安装字体到系统
查看>>
Android视频播放之VideoView
查看>>
非对称加密
查看>>
位运算巧用
查看>>
display:flex布局
查看>>
利用反射跟自定义注解拼接实体对象的查询SQL
查看>>