我们编写了一个 gRPC 异步服务器/客户端来并行化某些处理。我有一个关于异步服务器如何工作的基本问题。
例如,假设我们从客户端对一个方法进行了两次相同的异步调用,但为每次调用提供不同的输入(原始数据量的一半),以便我们可以并行化此操作。当我们这样做时,服务器端会发生什么?
我的假设是服务器会将这两个调用排队,然后在两个单独的线程中同时处理它们。但是,这似乎并非如此。
用所有原始数据处理单个调用所花费的时间比同一方法的两次 Async 调用所花费的总时间要少,每个调用的原始数据都为原始数据的一半。为什么会这样?
谢谢!
答案 0 :(得分:0)
这几乎不是关于 gRPC,而是关于分布在网络上的机器以及一台机器如何(似乎)(同时)处理多个任务。
也许一个思想实验(见下文)将有助于解释一些差异。在您的问题和思想实验中,我们都没有考虑(现实场景)存在网络延迟、连接管理时间和其他正在进行的过程。
对于单个消息,一旦服务器收到它(并假设它对时间的其他需求可以忽略不计),它就可以处理数据并返回结果(忽略 gRPC 消息必须从线路解组到 protos 和可以分成不同的类型进行处理,然后再返回进行传输等)。
对于多条消息,每次接收都会中断服务器,必须进行解组等、处理、编组、传输等。
如果没有其他进程在进行中,没有网络延迟,没有连接建立|拆卸等,没有(取消)编组时间,没有处理开销(例如为每条消息获取数据库连接),没有并发处理(消息到达完美,当一个完成,下一个到达),即使那样(!!)也有不可忽略的处理开销。
client
)通过电子邮件将数据发送给您(server
)。另外: