python grpc客户端如何管理连接?

use*_*803 4 python sockets connection grpc grpc-python

grpc 客户端何时创建和关闭连接?
我以以下方式开始代码:

channel = grpc.insecure_channel('localhost:8888')
stub = myservice_pb2_grpc.MyServiceStub(channel)
Run Code Online (Sandbox Code Playgroud)

声明 a 是否会channel在进程的整个生命周期内创建一个套接字?
因为即使我提供了无效的地址,insecure_channel()在发出第一个请求之前我也看不到任何错误。

或者,套接字仅在发出请求时创建并随后关闭?

Ric*_*lle 6

在 gRPC Python 中,通道对象对应于一个或多个 TCP 连接,具体取决于您的负载平衡策略。如果没有选择负载平衡策略(这似乎是绝大多数使用情况),那么是的,一个通道对应于单个 TCP 连接。

只要通道对象本身打开,通道表示的连接就会保持活动状态。因此,建议您在客户端进程的多个 RPC 调用中重用通道。建议您在不再需要通道后将其关闭。

有两种方法可以实现此目的。第一种是手动调用该close方法:

channel = grpc.insecure_channel('localhost:8888')
# send some RPCs
channel.close()
Run Code Online (Sandbox Code Playgroud)

另一种是使用上下文管理器:

with grpc.insecure_channel('localhost:8888') as channel:
  # send some RPCs

Run Code Online (Sandbox Code Playgroud)

  • 基于C++ Core实现的语言(C++、Python、Ruby、C#、PHP等)也有“子通道池”。无论负载平衡策略如何,子通道*始终*对应于单个 TCP 连接,并且子通道可以由多个通道共享。因此,如果使用相同的配置为同一后端创建两个通道,它们将共享一个子通道,从而共享一个 TCP 连接。Java/Go 中可能存在类似的东西,但我不确定。 (2认同)