[英]Cancel sync request in grpc python client
我正在使用同步长寿命 GET 请求创建 grpc python 客户端:
def main():
with grpc.insecure_channel(target='localhost:50051') as channel:
stub = hello_pb2_grpc.HelloStub(channel)
def signal_handler(signal, frame):
print("")
logging.warning("Interrupt signal. Exiting!")
channel.close()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
...
while True:
logging.info("Sending request for control")
try:
resp = stub.GetControl(hello_pb2.GetControlRequest(
node=node_id
))
print("Got response: {}".format(resp))
...
如果用户使用Ctrl-C关闭 python 客户端并再次启动客户端,它将重新连接到具有不同端口的 grpc 服务器。
问题是:客户端应该如何通知 grpc 服务器它的退出,所以服务器应该“丢弃”以前的连接?
几次客户端重新连接后,从服务器日志中我可以看到服务器尝试向不存在的对等方发送响应而没有任何错误:
INFO[0153] finished unary call with code OK grpc.code=OK grpc.method=GetControl grpc.service=world.World grpc.start_time="2021-02-19T12:41:17+01:00" grpc.time_ms=75479.79 peer.address="127.0.0.1:59976" span.kind=server system=grpc
INFO[0159] finished unary call with code OK grpc.code=OK grpc.method=GetControl grpc.service=world.World grpc.start_time="2021-02-19T12:41:05+01:00" grpc.time_ms=94089.74 peer.address="127.0.0.1:59862" span.kind=server system=grpc
注意:对等地址/端口不同。
使用客户端异步方法stub.GetControl将立即返回future
,可以随时取消future.cancel()
取消 API 仅在异步方法中可用。 同步 API 的目的是在返回之前完成所有工作,因此无法取消。 顺便说一句,如果你想通知服务器,为什么不显式发送一个 RPC? 您使用的GetControl
方法是一元调用,应该不会花很长时间才能完成。 如果您想在客户端/服务器之间进行更具交互性的通信,请尝试流式 RPC API。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.