grpc-python04 流传输

1.unary 单程

2.stream:

  • 双向 客户端(流)<-> 服务器端 send(流)

双方建立长链接,一方向另外一方推流的数据:

  • 单向 客户端(流)<-> 服务器端(非流)

  • 单向 客户端(非流)<-> 服务器端 send(流)

服务器端向客户端推流数据

proto:

service SayHello {
  rpc TestClientRevStream(TestClientRevStreamReq) returns (stream TestClientRevStreamResponse) {};
}

message TestClientRevStreamReq {
  string data = 1;
}

message TestClientRevStreamResponse {
  string result = 1;
}

service:

def TestClientRevStream(self, request, context):
        # 监听客户端是否是活还活着
        index = 0
        while context.is_active():
            index += 1
            time.sleep(1)
            data = request.data
            if data == 'close':
                # 如检测到异常数据
                context.cancel()
            result = "server push :%s, index is :%s" % (data, index)
            print(result)
            yield pb2.TestClientRevStreamResponse(result=result)

client:

resp = client.TestClientRevStream(pb2.TestClientRevStreamReq(
    data='close'
))
# print(resp.result)
for item in resp:
    print(item.result)

客户端向服务器端推流

proto:
rpc TestClientStream(stream TestClientStreamReq) returns (TestClientStreamResponse) {};

message TestClientStreamReq {
  string data = 1;
}

message TestClientStreamResponse {
  string result = 1;
}

service:
def TestClientStream(self, request_iterator, context):
    for idx, request in enumerate( request_iterator):
        # 阻塞在这里
        print(request.data)

        # 服务器主动关闭
        # if idx == 10:
        #     break
    return pb2.TestClientStreamResponse(result='ok')

client:
def test_client_stream():
    index=0
    while 1:
        time.sleep(1)
        data = str(random.random())
        index += 1
        if index == 5:
            break
        yield pb2.TestClientStreamReq(
            data=data
        )
resp = client.TestClientStream(test_client_stream())
print(resp)
print(resp.result)

双向流与强制和友好断开与超时机制

client:
response = client.TestTowWayStream(test_client_stream(), timeout=2)
for res in response:
    print(res.result)

service:
def TestTowWayStream(self, request_iterator, context):
    # 双向流传输
    index = 0
    for request in request_iterator:
        if index == 3:
            # 强制断开连接
            context.cancel()
        index += 1
        yield pb2.TestTowWayStreamResponse(result="server push : %s" % request.data)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值