请求流式gRPC客户端请求错误

时间:2019-01-08 19:52:01

标签: python streaming rpc grpc

当我运行我的gRPC客户端并尝试将请求流式传输到服务器时,我收到此错误:“ TypeError:具有类型list_iterator,但预期其中之一:字节,Unicode”

我需要以某种方式对发送的文本进行编码吗?错误消息具有一定意义,因为我肯定会传递迭代器。我从gRPC文档中假设这是必需的。 ({https://grpc.io/docs/tutorials/basic/python.html#request-streaming-rpc)Anyway,发送列表或字符串会产生类似的错误。 目前,我正在向请求中的服务器发送一小串字符串测试列表,但是我计划在将来以大量文本流式传输请求。

这是我的一些客户代码。

def gen_tweet_space(text):
    for tweet in text:
        yield tweet

def run():
 channel = grpc.insecure_channel('localhost:50050')
 stub = ProseAndBabel_pb2_grpc.ProseAndBabelStub(channel)

 while True:
     iterator = iter(block_of_text)
     response = stub.UserMarkov(ProseAndBabel_pb2.UserTweets(tweets=iterator))

这里是相关的服务器代码:

def UserMarkov(self, request_iterator, context):
        return ProseAndBabel_pb2.Babel(prose=markov.get_sentence(request_iterator.tweets))

以下是定义rpc和消息的原型:

service ProseAndBabel {

rpc GetHaiku (BabelRequest) returns (Babel) {}
rpc GetBabel (BabelRequest) returns (Babel) {}
rpc UserMarkov (stream UserTweets) returns (UserBabel) {}
}

message BabelRequest{
  string ask = 1;
}

message Babel{
  string prose = 1;
}

message UserTweets{
  string tweets = 1;
}

message UserBabel{
  string prose = 1;
}

我已经成功地使非流式rpc正常工作,但是在为python应用程序查找请求端流的演练时遇到了麻烦,因此我确定我在这里遗漏了一些东西。任何指导/方向表示赞赏!

1 个答案:

答案 0 :(得分:0)

您需要将请求的迭代器传递给gRPC客户端存根,而不是protobuf构造函数。当前代码尝试使用迭代器而不是单个字符串实例化UserTweets protobuf,从而导致类型错误。

response = stub.UserMarkov(ProseAndBabel_pb2.UserTweets(tweets=iterator))

您将需要拥有iterator来返回ProseAndBabel_pb2.UserTweets的实例,每个实例都包装您要发送的请求字符串之一,并将迭代器本身传递给存根。像这样:

iterator = iter([ProseAndBabel_pb2.UserTweets(tweets=x) for x in block_of_text])
response = stub.UserMarkov(iterator)