【问题标题】:grpc sync server limit handle threadgrpc 同步服务器限制句柄线程
【发布时间】:2018-09-13 10:34:03
【问题描述】:

我使用 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 次。

在这个测试中,我的测试方法有问题吗?还是有些东西错过了设置??

【问题讨论】:

    标签: c++ multithreading grpc


    【解决方案1】:

    你可以这样使用SetMaxThread:

    grpc::ResourceQuota rq;
    rq.SetMaxThreads(n);
    builder.SetResourceQuota(rq);
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 2019-12-23
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多