老师,这边有个grpc场景我想试用下asyncio,请教下
来源:17-9 grpc配合asyncio使用

ian116
2021-01-26
之前报错的问题我解决了,但是有了新问题,请教下老师。
重新说下背景:我想要通过同一个client访问多个server,执行attach_ue该方法。因为每个server端attach_ue耗时都较长且互不影响,因此想要在client端并发的收各server的rsp,并更新rsp_dic。
目前的代码跑下来,耗时并没有节约,和串行耗时一致。我理解的如果并发的话,rsp_dic中应该是先执行完的server的rsp先更新进去,但实际上跑出来代码并不符合预期。
之前没有asyncio的经验,麻烦老师帮我看下代码,后端的代码太多了,就不贴了,总之attach_ue是个相对耗时的逻辑。
def _choose_server(server_list):
chose_server_list = [serverIP for serverIP in ALL_SERVERS_LIST if serverIP in server_list] # ALL_SERVERS_LIST 就是多个server的ip的地址列表
return chose_server_list
def choose_stub_decorator(func):
@wraps(func)
async def operate_in_chose_stub(*args, **kwargs):
rsp_dic = {}
chose_server_list = ALL_SERVERS_LIST if not 'servers_list' in kwargs else _choose_server(kwargs['servers_list'])
for serverIP in chose_server_list:
async with Channel(serverIP, 50051) as channel:
stub = batch_operation_grpc.BatchOperationStub(channel)
rsp = await func(stub, *(args[1:]), **kwargs)
rsp_dic.update({serverIP: rsp})
return rsp_dic
return operate_in_chose_stub
class BatchOperationClient:
@staticmethod
@choose_stub_decorator
async def attach_ue(stub, **kwargs):
rsp = await stub.attach_ue(EMPTY)
print("Client received: " + str(rsp.operation_res))
return rsp.operation_res
if __name__ == '__main__':
print(time.localtime())
tem = asyncio.run(BatchOperationClient.attach_ue(servers_list = ['10.230.69.248', '127.0.0.1']))
print(time.localtime())
print(tem)
server端:
class BatchOperation(batch_operation_pb2_grpc.BatchOperationServicer):
def __init__(self):
self.DMZ_FLAG = 0
self.BRIDGE_FLAG = 0
def attach_ue(self, request, context):
attach_detach.attach() # 该动作耗时较长
return batch_operation_pb2.Operation_reply(operation_res=True)
写回答
2回答
-
bobby
2021-02-01
你这里的代码只能看出来你的client是使用了asyncio 但是你的server端完整代码没有 无法确定你的server端是否支持并发? 你的并发需要服务端能支持才行,客户端并发请求不够,也要服务端支持并发才行
00 -
bobby
2021-01-27
你这里能否贴一下完整的代码 我运行试试 包括后端和proto
012021-02-01
相似问题