gRPC 异步服务器是多线程的吗?

时间:2021-06-08 16:12:04

标签: grpc

我们编写了一个 gRPC 异步服务器/客户端来并行化某些处理。我有一个关于异步服务器如何工作的基本问题。

例如,假设我们从客户端对一个方法进行了两次相同的异步调用,但为每次调用提供不同的输入(原始数据量的一半),以便我们可以并行化此操作。当我们这样做时,服务器端会发生什么?

我的假设是服务器会将这两个调用排队,然后在两个单独的线程中同时处理它们。但是,这似乎并非如此。

用所有原始数据处理单个调用所花费的时间比同一方法的两次 Async 调用所花费的总时间要少,每个调用的原始数据都为原始数据的一半。为什么会这样?

谢谢!

1 个答案:

答案 0 :(得分:0)

这几乎不是关于 gRPC,而是关于分布在网络上的机器以及一台机器如何(似乎)(同时)处理多个任务。

也许一个思想实验(见下文)将有助于解释一些差异。在您的问题和思想实验中,我们都没有考虑(现实场景)存在网络延迟、连接管理时间和其他正在进行的过程。

对于单个消息,一旦服务器收到它(并假设它对时间的其他需求可以忽略不计),它就可以处理数据并返回结果(忽略 gRPC 消息必须从线路解组到 protos 和可以分成不同的类型进行处理,然后再返回进行传输等)。

对于多条消息,每次接收都会中断服务器,必须进行解组等、处理、编组、传输等。

如果没有其他进程在进行中,没有网络延迟,没有连接建立|拆卸等,没有(取消)编组时间,没有处理开销(例如为每条消息获取数据库连接),没有并发处理(消息到达完美,当一个完成,下一个到达),即使那样(!!)也有不可忽略的处理开销。

单次通话

  1. 您的同事(client)通过电子邮件将数据发送给您(server)。
  2. 收到数据后,您将对其进行处理并通过电子邮件将结果发回。

多次调用

  1. 您的同事将数据拆分成多封电子邮件发送给您。
  2. 收到每封电子邮件 (!) 后,您就开始处理数据。
  3. 如果在您完成之前收到另一封电子邮件,您也可以开始处理。
  4. 在每个文档上给自己几秒钟的时间,然后在它们之间切换。
  5. 当您完成每一项工作后,将结果通过电子邮件发送给您的同事。

另外:

  • 在向您发送电子邮件之前,您的同事去吃午饭
  • 在处理至少一项工作时,您需要带您的狗出去散步。
相关问题