社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何从python客户端保持双向gRPC通道的打开

Paul • 1 年前 • 252 次点击  

我定义了一个双向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通道。关于这个场景的例子不多,但感谢您的一些有益评论。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/158980
 
252 次点击