当我运行我的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应用程序查找请求端流的演练时遇到了麻烦,因此我确定我在这里遗漏了一些东西。任何指导/方向表示赞赏!
答案 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)