C++ 在微服务C+;中运行gRPC服务器+;
我是使用gRPC的新手。我正在创建一个需要运行长时间计算并通过gRPC将结果返回给客户端的微服务。我正在尝试解决如何在一个或多个线程中运行gRPC服务器,以及如何在另一个线程中运行计算 通常,您希望服务器实例运行,当请求传入时,执行一些数据检索或计算,然后形成结果并将其返回给请求者。在许多情况下,执行的操作非常繁琐,可能需要时间来处理。理想情况下,您不希望服务器线程在等待操作完成时阻塞。我发现的C++代码示例相当琐碎,并且正在寻找如何正确实现这种场景的更多指导。 控制器的外观类似于:C++ 在微服务C+;中运行gRPC服务器+;,c++,multithreading,c++17,grpc,C++,Multithreading,C++17,Grpc,我是使用gRPC的新手。我正在创建一个需要运行长时间计算并通过gRPC将结果返回给客户端的微服务。我正在尝试解决如何在一个或多个线程中运行gRPC服务器,以及如何在另一个线程中运行计算 通常,您希望服务器实例运行,当请求传入时,执行一些数据检索或计算,然后形成结果并将其返回给请求者。在许多情况下,执行的操作非常繁琐,可能需要时间来处理。理想情况下,您不希望服务器线程在等待操作完成时阻塞。我发现的C++代码示例相当琐碎,并且正在寻找如何正确实现这种场景的更多指导。 控制器的外观类似于: void
void dummyFunction() {
while(true) {
// do something
}
}
void start() {
thread main_thread = thread{dummyFunction};
main_thread.join();
...
mainGRPCServer->start(target_str);
}
在MainServer实现中,我使用了一个同步服务器,如greeter
示例中所示
void RunServer(string &server_address) {
NServiceImpl n_service;
SServiceImpl s_service;
grpc::EnableDefaultHealthCheckService(true);
grpc::reflection::InitProtoReflectionServerBuilderPlugin();
ServerBuilder builder;
// Listen on the given address without any authentication mechanism.
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
// Register "service" as the instance through which we'll communicate with
// clients. In this case it corresponds to an *synchronous* service.
builder.RegisterService(&n_service);
builder.RegisterService(&s_service);
// Finally assemble the server.
std::unique_ptr<Server> server(builder.BuildAndStart());
// Wait for the server to shutdown. Note that some other thread must be
// responsible for shutting down the server for this call to ever return.
server->Wait();
}
void MainServerImpl::start(string & target_str) {
worker_ = thread( RunServer, ref(target_str));
worker_.join();
}
无效运行服务器(字符串和服务器地址){
n服务impl n_服务;
SServiceImpl s_服务;
grpc::EnableDefaultHealthCheckService(true);
grpc::reflection::InitProtoReflectionServerBuilderPlugin();
服务器生成器;
//在没有任何身份验证机制的情况下侦听给定地址。
addListengPort(服务器地址,grpc::unsecureServerCredentials());
//将“服务”注册为我们将通过其进行通信的实例
//在本例中,它对应于一个*同步*服务。
注册服务(和n_服务);
注册服务(s_服务);
//最后组装服务器。
std::unique_ptr服务器(builder.BuildAndStart());
//等待服务器关闭。请注意,必须关闭其他线程
//负责关闭服务器以使此调用永远返回。
服务器->等待();
}
void MainServerImpl::start(字符串和目标字符串){
工作线程=线程(RunServer,ref(target_str));
worker_.join();
}
很明显,这个实现不会起作用,因为据我所知,grpc服务器本身有自己的线程模型。我已经研究了如何使用异步
服务器实现。有谁能指导我如何构造这个
更新:我在谷歌群组中找到了:
C++代码服务器有两种线程模型:同步和异步。大多数用户都希望使用同步模型:服务器将有一个(内部)线程池,用于管理将请求多路复用到一定数量的线程上(在请求之间重用线程)。异步模型允许您自带自己的线程模型,但使用起来有点麻烦——在这种模式下,您可以在服务器准备好进行新调用时请求新调用,并在没有工作要做时阻塞完成队列。通过安排何时阻塞完成队列以及在哪些完成队列上发出请求,您可以安排各种线程模型。*
但我似乎仍然找不到任何实施的好例子
到目前为止找到的最好的介绍是是的,这是最好的开始。使用async的helloworld示例()也是一个很好的参考。这些都是非常简单的示例。我明白要点,但文档可以改进。