我们正在编写一个利用gRPC的应用程序。我们实施了一堆客户可以定期调用的一元RPC,从而获得了预期的响应。
此外,我们有一个流(从服务器到客户端),用于连续流传输在所有客户端之间共享的某些信息(例如,一些硬件本地传感器信息,例如室温)。
Python StatusStreaming
函数现在返回流迭代器,并且不断循环以将数据流传输到客户端。
问题在于它为每个客户端返回一个新的迭代器;它每100毫秒更新一次,这使得我们的系统在满负荷运行之前无法为十几个客户端提供服务。另外,对每个客户端使用单独的周期也没有意义,因为我们需要向所有客户端发送相同的确切内容。
实际上是否可以向许多客户端广播相同的流内容,而不必为每个客户端具有不同的连接/频道?
我们使用gRPC-web
在浏览器客户端上实现RPC,因此bidi流式传输是不可能的(我不知道如何使用它,但是它不可用)。
版本使用的是与grpc-web绑定的版本(grpc版本grpc @ d8772cf和protobuf的版本为3.7.0)。
我们的服务器资源有限,就像我们在小型嵌入式服务器(1核,1GB内存)上一样。
这是流光
# Inside a method of the service class here
def _Status(self):
system_controller = self._system_status()
return protos.Stream(temperature_controller)
# Real Python streaming method
def Status(self, request, context):
def streaming_iterator():
while(context.is_active()):
time.sleep(0.5)
yield self._Status()
return streaming_iterator()
为每个客户端创建一个新的连接(以及专用的流媒体通道),因此产生一个新的while
周期来生成要发送的数据。不需要这种行为,因为实际上可以以广播方式在所有客户端之间共享相同的信息。