如何在 Python 的 gRPC 库中设置超时
How do you set a timeout in Python's gRPC Library
我有一个 grpc 服务器/客户端,今天偶尔会挂起,导致问题。这是从 Flask 应用程序调用的,该应用程序正在检查后台工作进程以确保它处于活动状态/正常运行。要向 gRPC 服务器发出请求,我有:
try:
health = self.grpc_client.Health(self.health_ping)
if health.message == u'PONG':
return {
u'healthy': True,
u'message': {
u'healthy': True,
u'message': u'success'
},
u'status_code': 200
}
except Exception as e:
if str(e.code()) == u'StatusCode.UNAVAILABLE':
return {
u'healthy': False,
u'message': {
u'healthy': False,
u'message': (u'[503 Unavailable] connection to worker '
u'failed')},
u'status_code': 200}
elif str(e.code()) == u'StatusCode.INTERNAL':
return {
u'healthy': False,
u'message': {
u'healthy': False,
u'message': (u'[500 Internal] worker encountered '
u'an error while responding')},
u'status_code': 200}
return {
u'healthy': False,
u'message': {u'healthy': False, u'message': e.message},
u'status_code': 500
}
客户端是存根:
channel = grpc.insecure_channel(address)
stub = WorkerStub(channel)
return stub
原型是:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.company.project.worker";
option java_outer_classname = "ProjectWorker";
option objc_class_prefix = "PJW";
package projectworker;
service Worker {
rpc Health (Ping) returns (Pong) {}
}
// The request message containing PONG
message Ping {
string message = 1;
}
// The response message containing PONG
message Pong {
string message = 1;
}
使用此代码,我将如何添加超时以确保我始终可以响应而不是失败和挂起?
timeout
is an optional keyword parameter on RPC invocation 所以你应该改变
health = self.grpc_client.Health(self.health_ping)
到
health = self.grpc_client.Health(self.health_ping, timeout=my_timeout_in_seconds)
.
您可能还希望以不同于其他错误的方式捕获和处理超时。
遗憾的是,关于这个主题的文档不是很好,所以这就是你所拥有的:
try:
health = self.grpc_client.Health(self.health_ping, timeout=my_timeout_in_seconds)
except grpc.RpcError as e:
e.details()
status_code = e.code()
status_code.name
status_code.value
超时将 return DEADLINE_EXCEEDED status_code.value.
要在客户端定义超时,请在调用服务函数时添加可选参数timeout=<timeout in seconds>
;
channel = grpc.insecure_channel(...)
stub = my_service_pb2_grpc.MyServiceStub(channel)
request = my_service_pb2.DoSomethingRequest(data='this is my data')
response = stub.DoSomething(request, timeout=0.5)
Note a timeout situation will raise an exception
我有一个 grpc 服务器/客户端,今天偶尔会挂起,导致问题。这是从 Flask 应用程序调用的,该应用程序正在检查后台工作进程以确保它处于活动状态/正常运行。要向 gRPC 服务器发出请求,我有:
try:
health = self.grpc_client.Health(self.health_ping)
if health.message == u'PONG':
return {
u'healthy': True,
u'message': {
u'healthy': True,
u'message': u'success'
},
u'status_code': 200
}
except Exception as e:
if str(e.code()) == u'StatusCode.UNAVAILABLE':
return {
u'healthy': False,
u'message': {
u'healthy': False,
u'message': (u'[503 Unavailable] connection to worker '
u'failed')},
u'status_code': 200}
elif str(e.code()) == u'StatusCode.INTERNAL':
return {
u'healthy': False,
u'message': {
u'healthy': False,
u'message': (u'[500 Internal] worker encountered '
u'an error while responding')},
u'status_code': 200}
return {
u'healthy': False,
u'message': {u'healthy': False, u'message': e.message},
u'status_code': 500
}
客户端是存根:
channel = grpc.insecure_channel(address)
stub = WorkerStub(channel)
return stub
原型是:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.company.project.worker";
option java_outer_classname = "ProjectWorker";
option objc_class_prefix = "PJW";
package projectworker;
service Worker {
rpc Health (Ping) returns (Pong) {}
}
// The request message containing PONG
message Ping {
string message = 1;
}
// The response message containing PONG
message Pong {
string message = 1;
}
使用此代码,我将如何添加超时以确保我始终可以响应而不是失败和挂起?
timeout
is an optional keyword parameter on RPC invocation 所以你应该改变
health = self.grpc_client.Health(self.health_ping)
到
health = self.grpc_client.Health(self.health_ping, timeout=my_timeout_in_seconds)
.
您可能还希望以不同于其他错误的方式捕获和处理超时。 遗憾的是,关于这个主题的文档不是很好,所以这就是你所拥有的:
try:
health = self.grpc_client.Health(self.health_ping, timeout=my_timeout_in_seconds)
except grpc.RpcError as e:
e.details()
status_code = e.code()
status_code.name
status_code.value
超时将 return DEADLINE_EXCEEDED status_code.value.
要在客户端定义超时,请在调用服务函数时添加可选参数timeout=<timeout in seconds>
;
channel = grpc.insecure_channel(...)
stub = my_service_pb2_grpc.MyServiceStub(channel)
request = my_service_pb2.DoSomethingRequest(data='this is my data')
response = stub.DoSomething(request, timeout=0.5)
Note a timeout situation will raise an exception