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



假设我需要使用python gRPC将大量数据从客户端发送到服务器。并且我希望在发送消息时继续剩余的计算,而不是阻塞代码。有什么方法可以实现这一点吗?

我将使用greetiner_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))

但运行时间实际上与没有async/await的版本相同。async/await不起作用。我想知道我的代码有什么错误吗?或者还有其他方法?

并发不同于并行。AsyncIO允许多个协同程序在同一线程上运行,但它们实际上并不是同时计算的。如果线程被赋予CPU繁重的工作;computation(("在您的代码片段中,它不会将控制权交还给事件循环,因此在其他协程上不会有任何进展。

此外,在该片段中,RPC取决于";computation((";,这意味着将为每个RPC序列化工作。但是,我们仍然可以从AsyncIO中获得一些并发性,方法是将它们移交给具有asyncio.gather():的事件循环

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)))

最新更新