grpc客户端和服务器的共享内存

时间:2017-11-29 10:45:54

标签: grpc

我的项目是在服务器中读取图像,进行一些处理,然后将整个图像传递给客户端。客户端占用映像并执行一些处理并将一些输出值返回给服务器。服务器和客户端之间使用的映像大小为[640x480x3]。

以下是我想到的各种技术来实现这个问题:

  1. 将整个像素值传递给从服务器到客户端的消息
    • 将消息从一台服务器发送到一台客户端需要75毫秒,即使它们位于同一系统中! (绝不是个好主意)
  2. 将整个图像拆分为块,然后使用流从服务器发送到客户端。
    • SO中有各种各样的答案。我目前正致力于实现这一目标。
  3. 将像素值分配给服务器和客户端中gRPC识别的<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> 。换句话说,将图像放在gRPC的共享内存中,服务器和客户端都可以访问它(假设服务器和客户端都在同一系统中)。
    • 服务器和客户端之间的这种消息传递模式是否可行?如果是,请提供相关文档或示例的一些参考。

2 个答案:

答案 0 :(得分:1)

gRPC目前没有(在当前时间)支持任何语言API中同一系统上不同进程之间的任何类型的共享内存传输。一个密切的变体是C ++和Java支持的进程内传输。这用于在同一进程中在客户端和服务器之间发送消息(例如,如果要在与可能也有直接外部接口的服务器相同的地址空间中运行代理),并且唯一的区别是这种和传统的gRPC操作是在两种语言中创建通道时以及在Java中构建服务器时。这方面的Java文档位于https://grpc.io/grpc-java/javadoc/io/grpc/inprocess/InProcessServerBuilder.html。对于C ++,您只需在服务器而不是grpc :: CreateChannel上调用Server :: InProcessChannel,因为只要您有指针,所有服务器都会自动在C ++中具有进程内功能。

希望有所帮助!

@vjpai

答案 1 :(得分:0)

我会说你不应该使用gRPC。您的问题听起来更像是分布式图像处理。我建议使用FPGA来做这类事情。 CPU的另一个解决方案可能是R / DMA。使用DMA,您只需绕过CPU并直接使用其内存。两个CPU都可以通过gRPC相互通信。我们假设您有2台服务器。服务器A具有映像,服务器B需要它。服务器B通过gRPC询问指针地址,服务器A给他地址,服务器B通过DMA获取它。如果您使用RDMA,请确保您拥有高速低延迟网络解决方案。具有10 Gbit / s或更高的纳秒延迟。两种解决方案都适用于更大的图像。如果您只想发送较小的图像,只需使用一些文件传输协议。