Ошибка запроса клиента gRPC потоковой передачи запросов - PullRequest
0 голосов
/ 08 января 2019

Когда я запускаю свой клиент 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 голосов
/ 09 января 2019

Вам нужно передать итератор запросов в заглушку клиента 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)
...