Когда я запускаю свой клиент 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, поэтому я уверен, что здесь что-то упущено. Любое руководство / направление приветствуется!