Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在微服务C+;中运行gRPC服务器+;_C++_Multithreading_C++17_Grpc - Fatal编程技术网

C++ 在微服务C+;中运行gRPC服务器+;

C++ 在微服务C+;中运行gRPC服务器+;,c++,multithreading,c++17,grpc,C++,Multithreading,C++17,Grpc,我是使用gRPC的新手。我正在创建一个需要运行长时间计算并通过gRPC将结果返回给客户端的微服务。我正在尝试解决如何在一个或多个线程中运行gRPC服务器,以及如何在另一个线程中运行计算 通常,您希望服务器实例运行,当请求传入时,执行一些数据检索或计算,然后形成结果并将其返回给请求者。在许多情况下,执行的操作非常繁琐,可能需要时间来处理。理想情况下,您不希望服务器线程在等待操作完成时阻塞。我发现的C++代码示例相当琐碎,并且正在寻找如何正确实现这种场景的更多指导。 控制器的外观类似于: void

我是使用gRPC的新手。我正在创建一个需要运行长时间计算并通过gRPC将结果返回给客户端的微服务。我正在尝试解决如何在一个或多个线程中运行gRPC服务器,以及如何在另一个线程中运行计算

通常,您希望服务器实例运行,当请求传入时,执行一些数据检索或计算,然后形成结果并将其返回给请求者。在许多情况下,执行的操作非常繁琐,可能需要时间来处理。理想情况下,您不希望服务器线程在等待操作完成时阻塞。我发现的C++代码示例相当琐碎,并且正在寻找如何正确实现这种场景的更多指导。 控制器的外观类似于:

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示例()也是一个很好的参考。

这些都是非常简单的示例。我明白要点,但文档可以改进。