【问题标题】:Grpc python client server streaming not working as expectedGrpc python客户端服务器流未按预期工作
【发布时间】:2017-10-31 21:47:37
【问题描述】:

一个简单的 grpc 服务器客户端,客户端发送一个 int 并且服务器流 int 的返回。

客户端正在一一读取消息,但服务器正在立即运行生成器函数以获取所有响应。

服务器代码:

import test_pb2_grpc as pb_grpc
import test_pb2 as pb2
import time
import grpc
from concurrent import futures

class test_servcie(pb_grpc.TestServicer):

    def Produce(self, request, context):
        for i in range(request.val):
            print("request came")
            rs = pb2.Rs()
            rs.st = i + 1
            yield rs



    def serve():


        server = 
        grpc.server(futures.ThreadPoolExecutor(max_workers=10))
        pb_grpc.add_TestServicer_to_server(test_servcie(), server)
        server.add_insecure_port('[::]:50051')
        print("service started")
        server.start()
        try:
            while True:
                time.sleep(3600)
        except KeyboardInterrupt:
            server.stop(0)


if __name__ == '__main__':
    serve()

客户端代码:

import grpc
import test_pb2_grpc as pb_grpc
import test_pb2 as pb
def test():
    channel = grpc.insecure_channel(
    '{host}:{port}'.format(host="localhost", port=50051))

    stub = pb_grpc.TestStub(channel=channel)

    req = pb.Rq()
    req.val = 20
    for s in stub.Produce(req):
        print(s.st)
        import time
        time.sleep(10)

test()

原始文件: 语法 = "proto3";

service Test {
    rpc Produce (Rq) returns (stream Rs);
}

message Rq{
    int32 val = 1;
}
message Rs{
    int32 st = 1;
}

启动服务器后 当我运行客户端时,服务器端生成器开始运行并立即完成它循环范围。 我所期望的是它会随着客户的呼叫而一一进行,但事实并非如此。 这是预期的行为吗?我的客户仍在打印这些值,但服务器已经完成了该功能。

【问题讨论】:

    标签: python python-3.x grpc


    【解决方案1】:

    是的,这种行为是意料之中的。 gRPC 具有 RPC 两侧之间的流控制(因此在一侧生成消息过快不会耗尽另一侧的内存),但也允许少量缓冲(以便合理少量数据可能在另一方明确要求之前由一方发送)。在您的情况下,从服务器发送到客户端的 20 条消息都在这个小范围内。服务端 gRPC Python 运行时调用你的服务端 Produce 方法,消耗它的 20 条消息的全部输出,并将所有这些消息通过网络发送到你的客户端,它们在本地由调用端 gRPC Python 保存运行时,直到您的调用端 test 函数要求它们。

    如果您想查看流控制的实际效果,请尝试使用大消息(大约 1 MB 大小)或更改余量的大小(我认为这是通过通道参数完成的,但这些是高级的和相对不受支持的功能,所以这留作练习)。

    【讨论】:

    • 非常感谢 Nathaniel Manista 的回复,现在我对流媒体有了更好的了解。但是对于我们的实现请求和响应是依赖的,所以我们是客户端的一个队列来模拟它。我们正在让请求生成器等到我们收到从服务器流发回的第一个请求的响应。
    猜你喜欢
    • 2014-04-08
    • 2012-08-16
    • 2022-11-02
    • 1970-01-01
    • 2022-08-17
    • 2020-09-09
    • 2021-04-10
    • 2020-10-18
    • 2020-11-20
    相关资源
    最近更新 更多