当前位置: 首页 > 知识库问答 >
问题:

请求流gRPC客户端请求错误

左丘季
2023-03-14

当我运行我的gRPC客户端,它试图将请求流式传输到服务器时,我收到了这个错误:"TypeError: has typelist_iterator,但期望其中之一:bytes, unicode"

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

这是我的一些客户代码。

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个答案

夏侯华彩
2023-03-14

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

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

相反,您需要有您的迭代器来返回ProseAndBabel_pb2. UserTweets的实例,每个实例都包装了您想要发送的请求字符串之一,并将迭代器本身传递给存根。类似于:

iterator = iter([ProseAndBabel_pb2.UserTweets(tweets=x) for x in block_of_text])
response = stub.UserMarkov(iterator)
 类似资料:
  • 客户端的HTTP/HTTPS请求。 进程:主进程​ ClientRequest是由EventEmitter来实现Writable Stream​ new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth

  • httplib 库主要用来模拟客户端发送 HTTP 请求,类似于 Curl 工具,支持 JQuery 类似的链式操作。使用起来相当的方便;通过如下方式进行安装: go get github.com/astaxie/beego/httplib 如何使用 首先导入包 import ( "github.com/astaxie/beego/httplib" ) 然后初始化请求方法,返回对象 r

  • 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的。您可以查阅HTTP协议来获得更多的信息。 下表列出了浏览器端信息头的一些重要内容,在以后的网络编程中将会经常见到这些信息: 信息 描述 Accept 指定浏览器或其他客户端可以处理的MIME类型。它的值通常为 image/png 或 image/jpeg Accept-Char

  • 同步-向API发出一批请求,并定期将响应保存到我的数据库。 客户端-从我的客户端的用户向API请求的传递。 服务的文档指定了在给定时间段内可以发出的最大请求数的以下规则: 在一天中: null null 超过这些限制不会导致立即锁定-不会抛出任何异常。但供应商可能会感到恼火,联系我们,然后禁止我们使用他的服务。因此,我需要有一些请求延迟机制,在适当的地方,以防止这一点。我是这样看的: 最安全和最简

  • 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的。您可以查看 HTTP 协议 了解更多相关信息。 以下是来自于浏览器端的重要头信息,您可以在 Web 编程中频繁使用: 头信息 描述 Accept 这个头信息指定浏览器或其他客户端可以处理的 MIME 类型。值 image/png 或 image/jpeg 是最常

  • Java import java.io.IOException; import java.net.URLEncoder; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import jav