老师,这边有个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端是否支持并发? 你的并发需要服务端能支持才行,客户端并发请求不够,也要服务端支持并发才行

0
0

bobby

2021-01-27

你这里能否贴一下完整的代码 我运行试试 包括后端和proto

0
1
ian116
原来的问题解决了,但预期的并行似乎没有成功,麻烦老师再帮忙看下,谢谢
2021-02-01
共1条回复

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程