与许多客户端共享同一gRPC服务器流迭代器

时间:2019-05-29 15:51:41

标签: python streaming grpc

我们正在编写一个利用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周期来生成要发送的数据。不需要这种行为,因为实际上可以以广播方式在所有客户端之间共享相同的信息。

0 个答案:

没有答案