Как я могу заставить сервер grp c выполнять другую работу, когда нет звонков клиента? - PullRequest
0 голосов
/ 05 марта 2020

У меня есть простая функция, которая обслуживается с помощью grp c, метод запуска этой службы такой:

void start_server() {
    string addr("0.0.0.0:50002");
    ImageServiceImpl service;
    ServerBuilder builder;
    builder.AddListeningPort(addr, grpc::InsecureServerCredentials());
    builder.RegisterService(&service);
    builder.SetMaxSendMessageSize(1L << 31);
    builder.SetMaxReceiveMessageSize(1L << 31);

    std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
    std::cout << "service started, listening to: " << addr << std::endl;

    server->Wait();

}

Это стандартный сервер GRP c. Моя проблема в том, что мне нужен сервер для выполнения других программ, когда не вызывается запрос клиента. И когда приходит запрос клиента, серверная программа будет прервана, и сервер обработает запрос. После обработки запроса сервер продолжает выполнять свою программу «досуг». Проблема в том, что программа блокируется на server->Wait(), поэтому, когда не поступает клиентский запрос, сервер ничего не может сделать, кроме как ждать, а это не то, что мне нужно.

Надеюсь, я выразил четко. Как я могу сделать это с GRP c?

1 Ответ

0 голосов
/ 06 марта 2020

Разве запуск потока до server->Wait() не решает эту проблему? Вкл. NET C #, я решил это так:

...
// Start other work
MainTask mainTask = new MainTask(configurator, _gRPCManager);
Thread mainThread = new Thread(mainTask.Run);
mainThread.IsBackground = true;
mainThread.Start();
// Start gRPS
CreateHostBuilder(args, configurator).Build().Run();
...