以异步方式使用同步API 我正在做一个节省服务,并且通过C++中的节俭版 TunBuffgServer < /Cuff>选项,建立了一个事件驱动的服务器。然而,目前我的服务依赖于其他服务,我想知道在进行只有同步接口的RPC调用时,最佳实践是什么

以异步方式使用同步API 我正在做一个节省服务,并且通过C++中的节俭版 TunBuffgServer < /Cuff>选项,建立了一个事件驱动的服务器。然而,目前我的服务依赖于其他服务,我想知道在进行只有同步接口的RPC调用时,最佳实践是什么,c++,c++11,asynchronous,rpc,thrift,C++,C++11,Asynchronous,Rpc,Thrift,假设服务a依赖于服务U和V,当服务a从U和V获得RPC调用的结果时,它分别使用来自U和V的先前调用的结果对服务X和Y进行RPC调用,但thrift仅提供同步客户端调用,也就是说,没有使客户端调用异步和基于事件的选项(如服务器代码所示)。所以代码大纲看起来有点像这样 Output some_RPC_call(Input input) { auto u_result = U(input); auto x_result = X(u_result); auto v_result

假设服务a依赖于服务U和V,当服务a从U和V获得RPC调用的结果时,它分别使用来自U和V的先前调用的结果对服务X和Y进行RPC调用,但thrift仅提供同步客户端调用,也就是说,没有使客户端调用异步和基于事件的选项(如服务器代码所示)。所以代码大纲看起来有点像这样

Output some_RPC_call(Input input) {
    auto u_result = U(input);
    auto x_result = X(u_result);

    auto v_result = V(input);
    auto y_result = Y(v_result);

    return Output(x_result, y_result);
}
正如您所看到的,对服务U、V、X和Y的调用都是同步和阻塞的,因此在这里浪费了大量的时间,并且每个服务器请求(即
some_RPC_call()
)的延迟都比服务发出异步请求(大概是这样)的延迟要高

这个问题的一个解决方案是按如下方式构造上述请求

Output some_RPC_call(Input input) {

    auto future_x_result = std::async([&]() {
        auto u_result = U(input);
        return X(u_result);
    });

    auto future_y_result = std::async([&]() {
        auto v_result = V(input);
        return Y(v_result);
    });

    return Output(future_x_result.get(), future_y_result.get());
}
这样,两个请求都在各自的线程中得到服务,因此两个请求都不会阻塞另一个。但是,
std::async
的开销与手动创建线程对象并等待其完成的开销相同,因为默认启动策略只是在单独的线程上启动任务

这里使用线程池和消息队列单独调度每个thrift客户端请求的常用方法是什么?但是,并行性同样受到池提供的线程粒度的限制(例如,在大多数情况下,线程池中的线程数量等于系统上的处理器数量,并且每当一个I/O请求阻塞时,其他I/O请求也会在同一处理器块上排队)

我正在努力找到一个能在这里正常工作的解决方案,因为很难将上面的请求转换为事件驱动系统,在这个系统中,只有当它所依赖的套接字准备好接收或发送值时,每个请求才在消息队列中服务

对如何解决这个问题有什么建议吗?节俭有解决这个问题的天然方法吗