有没有办法在GRPC服务器端设置超时? [英] is there a way to setup timeout in grpc server side?
本文介绍了有没有办法在GRPC服务器端设置超时?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我们尝试从客户端断开连接,但无法从服务器端断开连接。在这个链接Problem with gRPC setup. Getting an intermittent RPC unavailable error中,Angad说可以用python定义这些参数,但无法定义。
我的代码片段:
def serve():
server = grpc.server(thread_pool=futures.ThreadPoolExecutor(max_workers=2), maximum_concurrent_rpcs=None, options=(('grpc.so_reuseport', 1),('grpc.GRPC_ARG_KEEPALIVE_TIME_MS', 1000)))
stt_pb2_grpc.add_ListenerServicer_to_server(Listener(), server)
server.add_insecure_port("localhost:50051")
print("Server starting in port "+str(50051))
server.start()
try:
while True:
time.sleep(60 * 60 * 24)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
我预计在Python中,来自GRPC服务器端的连接也应该超时。
推荐答案
简而言之,您可能会发现context.abort(...)
有用,请参阅API reference。超时服务器处理程序不受GRPC Python的基础C-Core API支持。因此,您必须在Python中实现您自己的超时机制。
您可以尝试其他StackOverflow问题中的一些解决方案。
或者使用简单但开销大的额外线程在一定时间长度后中止连接。它可能如下所示:
_DEFAULT_TIME_LIMIT_S = 5
class FooServer(FooServicer):
def RPCWithTimeLimit(self, request, context):
rpc_ended = threading.Condition()
work_finished = threading.Event()
def wrapper(...):
YOUR_ACTUAL_WORK(...)
work_finished.set()
rpc_ended.notify_all()
def timer():
time.sleep(_DEFAULT_TIME_LIMIT_S)
rpc_ended.notify_all()
work_thread = threading.Thread(target=wrapper, ...)
work_thread.daemon = True
work_thread.start()
timer_thread = threading.Thread(target=timer)
timer_thread.daemon = True
timer_thread.start()
rpc_ended.wait()
if work_finished.is_set():
return NORMAL_RESPONSE
else:
context.abort(grpc.StatusCode.DEADLINE_EXCEEDED, 'RPC Time Out!')
这篇关于有没有办法在GRPC服务器端设置超时?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文