grpc同步服务器限制句柄线程

时间:2018-09-13 10:34:04

标签: c++ multithreading grpc

我使用grpc cpp示例“ helloworold”代码来测试限制句柄线程。但是我找不到任何方法。

grpc版本:1.15

linux:ubuntu 16.04

我这样设置构建器:

builder.SetSyncServerOption(ServerBuilder::SyncServerOption::MIN_POLLERS, 1);
builder.SetSyncServerOption(ServerBuilder::SyncServerOption::MAX_POLLERS, 1);
builder.SetSyncServerOption(ServerBuilder::SyncServerOption::NUM_CQS, 1);

像这样设置手柄:

class GreeterServiceImpl final : public Greeter::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloReply* reply) override {
    std::string prefix("Hello ");
    std::cout << "start " << std::this_thread::get_id() << std::endl;
    reply->set_message(prefix + request->name());

    //**** sleep 5s, keep this thread block ****
    std::this_thread::sleep_for(std::chrono::seconds(5));

    std::cout << "end " << std::this_thread::get_id() << std::endl;
    return Status::OK;
  }
};

我使用示例客户端,并在100个线程中调用SayHello,服务器日志显示该线程被创建了100次。

在此测试中,我的测试方式是否错误?还是有些东西错过了设置?

2 个答案:

答案 0 :(得分:0)

您正在使用的是同步API,它将在每次调用时启动一个线程。您可以查看异步API以减少线程数。

答案 1 :(得分:0)

您可以通过以下方式使用SetMaxThread:

if ("production" === "production") {
  // ...do production stuff
} else {
  // ...do development stuff
}

似乎每个完成队列都需要一个线程。因此,当您有1个完成队列时,如果n = 4,则剩下3个线程用于处理请求。