一直学一直嗨,一直嗨一直学

简单介绍Python grpc超时机制

工作中遇到一个问题,上游服务通过grpc调用下游服务,但是由于下游服务负载太高导致上游服务的调用会随机出现超时的情况,但是有一点不太明确:超时之后,下游服务还会继续进行计算么?

于是自己写了一个damon试了一下:

client:
  # Copyright 2015 gRPC authors.  #  # Licensed under the Apache License, Version 2.0 (the "License");  # you may not use this file except in compliance with the License.  # You may obtain a copy of the License at  #  #   http://www.apache.org/licenses/LICENSE-2.0  #  # Unless required by applicable law or agreed to in writing, software  # distributed under the License is distributed on an "AS IS" BASIS,  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  # See the License for the specific language governing permissions and  # limitations under the License.  """The Python implementation of the GRPC helloworld.Greeter client."""    from __future__ import print_function  import logging    import grpc    import helloworld_pb2  import helloworld_pb2_grpc      def run():    # NOTE(gRPC Python Team): .close() is possible on a channel and should be    # used in circumstances in which the with statement does not fit the needs    # of the code.    with grpc.insecure_channel('localhost:50051') as channel:      stub = helloworld_pb2_grpc.GreeterStub(channel)      response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'), timeout=30)    print("Greeter client received: " + response.message)      if __name__ == '__main__':    logging.basicConfig()    run()
server:
  # Copyright 2015 gRPC authors.  #  # Licensed under the Apache License, Version 2.0 (the "License");  # you may not use this file except in compliance with the License.  # You may obtain a copy of the License at  #  #   http://www.apache.org/licenses/LICENSE-2.0  #  # Unless required by applicable law or agreed to in writing, software  # distributed under the License is distributed on an "AS IS" BASIS,  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  # See the License for the specific language governing permissions and  # limitations under the License.  """The Python implementation of the GRPC helloworld.Greeter server."""    from concurrent import futures  import time  import logging    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):    count = 0    while count < 10:      print('time:%s' % (time.time()))      time.sleep(5)      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__':    logging.basicConfig()    serve()

这两个例子就是在grpc官方提供的python例子上做了一下小的改动,得到的结果是:当client超时报错退出之后,server还是会继续进行计算,直到结束,那如果是这样的话,超时的机制对于server来说是没有作用的,即使client已经不再等待这个结果了,但是server还是会继续计算,浪费server的资源。

Tags: