zoukankan      html  css  js  c++  java
  • grpc python quickstart

    参考:grpc python quickstart

    准备

    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 time
    
    import grpc
    
    import helloworld_pb2
    import helloworld_pb2_grpc
    
    _ONE_DAY_IN_SECONDS = 60 * 60 * 24
    
    
    class 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_function
    
    import grpc
    
    import helloworld_pb2
    import helloworld_pb2_grpc
    
    
    def 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 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 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 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.proto
    
    import 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('
    x10helloworld.protox12
    helloworld"x1c
    x0cHelloRequestx12x0c
    x04namex18x01 x01(	"x1d
    
    HelloReplyx12x0f
    x07messagex18x01 x01(	2x8ex01
    x07Greeterx12>
    x08SayHellox12x18.helloworld.HelloRequestx1ax16.helloworld.HelloReply"x00x12x43
    
    SayHelloAgainx12x18.helloworld.HelloRequestx1ax16.helloworld.HelloReply"x00x42x36
    x1bio.grpc.examples.helloworldBx0fHelloWorldProtoPx01xa2x02x03HLWbx06proto3')
    )
    _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'] = _HELLOREPLY
    
    HelloRequest = _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('
    33io.grpc.examples.helloworldB17HelloWorldProtoP012420203HLW'))
    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 grpc
    
    import helloworld_pb2 as helloworld__pb2
    
    
    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=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

  • 相关阅读:
    泛型通配符 ?
    算法:确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构
    Math类中常用方法
    很认真的聊一聊程序员的自我修养
    高性能最终一致性框架Ray之基本概念原理
    asp.net core VS goang web[修正篇]
    Asp.net core与golang web简单对比测试
    高性能Socket组件和RPC,让你像写本地代码一样开发网络应用和分布式程序
    .NET MVC 插件化框架支持原生MVC的Area和路由特性
    .NET MVC插件化开发框架源码(插件功能完善版)
  • 原文地址:https://www.cnblogs.com/qq952693358/p/6942354.html
Copyright © 2011-2022 走看看