微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

发送消息时,Python gRPC可以进行计算吗?

如何解决发送消息时,Python gRPC可以进行计算吗?

假设我需要使用python gRPC从客户端向服务器发送大量数据。我想在发送消息时继续其余的计算,而不是阻塞代码。有什么办法可以实现呢?

我将使用greeter_client.py中的修改后的代码通过示例来说明问题。

  for i in range(5):
      res=computation()
      response = stub.SayHello(helloworld_pb2.HelloRequest(data=res))

我希望在发送上一次迭代的“ res”时继续进行下一次迭代的计算。为此,我尝试了“ async / await”,它看起来像这样

async with aio.insecure_channel('localhost:50051') as channel:
    stub = helloworld_pb2_grpc.GreeterStub(channel)
    for j in range(5):
        res=computation()
        response = await stub.SayHello(helloworld_pb2.HelloRequest(data=res))

但是运行时间实际上与没有异步/等待的版本相同。异步/等待不起作用。我想知道我的代码中是否有任何错误或其他方法

解决方法

并发不同于并行。 AsyncIO允许多个协程在同一线程上运行,但实际上并非同时计算它们。如果您的代码段中给线程分配了诸如“ computation()”之类的CPU繁重的工作,则它不会将控制权归还给事件循环,因此在其他协程上不会有任何进展。

此外,在代码段中,RPC取决于“ computation()”的结果,这意味着将为每个RPC序列化工作。但是我们仍然可以通过使用asyncio.gather()将它们移交给事件循环来从AsyncIO中获得一些并发性:

async with aio.insecure_channel('localhost:50051') as channel:
    stub = helloworld_pb2_grpc.GreeterStub(channel)
    
    async def one_hello():
        res=computation()
        response = await stub.SayHello(helloworld_pb2.HelloRequest(data=res))

    await asyncio.gather(*(one_hello() for _ in range(5)))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。