我定义了一个双向gRPC流RPC,用于与服务器交换一些配置信息。
服务器:在C中实现++
客户端:在python 3.10中实现
客户端使用以下方式打开与服务器的通道:
grpc.channel_ready_future(self.channel).result(超时=5)
当客户端中的配置发生更改时,它会构建gRPC消息,并通过调用bi-dir RPC(RPC名称“Push”)将消息生成到服务器。客户端从不通过调用close来显式关闭通道。但是,一旦服务器接收到消息,通道就会被重置,所以来自客户端的下一条消息将使用另一个通道。
我的问题是,我在客户身上做错了什么,为什么频道会关闭?有一点是,服务器实际上不会发回任何东西,所以如果我有一个如下所示的for循环,客户端代码就会挂起:
responses = self.stub.Push(
make_client_msg(msg),timeout=timeout)
for response in responses:
logging.info("response is {}".format(response))
所以我删除了循环,只打印响应,但通道被重置:
responses = self.stub.Push(
make_client_msg(msg),timeout=timeout)
logging.info("response is {}".format(responses))
我希望我能够解释这个问题,而不必太过详细。
++++++++
更新:
我能够通过创建两个子进程来解决通道重置问题,第一个同步进程构建gRPC消息并推入消息队列,第二个进程是异步的,在while循环中从队列中读取并将消息写入gRPC通道。在写入gRPC通道后,我从不调用done_writing(),这会使我的通道保持活动状态,并且我不需要为每次写入创建一个新通道,这是一个昂贵的操作。我之前使用python迭代器实现了整个过程,但它在迭代器的末尾发送EOM,重置了我的gRPC通道。关于这个场景的例子不多,但感谢您的一些有益评论。