gRPC: Как обработчики RPC могут правильно определить, был ли сервер `Shutdown ()`

Сейчас я использую хакерский способ - глобальную переменную - чтобы обработчики RPC могли определять, что Server был (вот-вот будет) вызван Shutdown().

bool g_ServerIsNotDead = true;   // Hack!

Status StreamServiceImpl::GetCurrentTemperature(ServerContext *context_,
                                                const UpdateInterval *request_,
                                                ServerWriter<Temperature> *stream_)
{
  auto currentTemp = 100.0f;
  while(g_ServerIsNotDead)   // Hack!!!
  {
    qDebug() << QThread::currentThreadId() << currentTemp << "farenheit.";

    Temperature message;
    message.set_temperature(currentTemp);
    stream_->Write(message);

    QThread::sleep(2);

    currentTemp += 1.0f;
  }

  return Status::OK;
}

void insideSomeFunction() {
   // Testing shutdown 5 seconds later
   QTimer::singleShot(std::chrono::seconds(5), this, [=]() {
      qDebug() << "Shuting down!";

      g_ServerIsNotDead = false;   // Hack!!

      this->server->Shutdown();    // This method actually blocks until all RPC handlers have exited, believe it or not!

      emit shutdown();

      qDebug() << "All dead.";
  });
}

Ссылка: https://github.com/C0D1UM/grpc-qt-example/blob/master/rpc_server/hellostream_server.cpp

Было бы очень хорошо, если бы я мог каким-то образом проверить, что Server был Shutdown() от grpc::ServerContext, но я не видел никаких подходящих методов для этого.

Еще лучше, если бы кто-нибудь мог предложить способ полностью исключить цикл while (?). Я использую Qt, поэтому все управляется событиями.


person sivabudh    schedule 05.07.2018    source источник


Ответы (2)



Мы можем использовать ServerContext::IsCancelled в качестве критерия прерывания / завершения в потоковых API. Я изменил GetCurrentTemperature(...) следующим образом (просто заменил g_ServerIsNotDead на !context_->IsCancelled()), и это сработало:

Status StreamServiceImpl::GetCurrentTemperature(ServerContext *context_,
                                                const UpdateInterval *request_,
                                                ServerWriter<Temperature> *stream_) {
  auto currentTemp = 100.0f;
  while(!context_->IsCancelled) {
    qDebug() << QThread::currentThreadId() << currentTemp << "farenheit.";
    Temperature message;
    message.set_temperature(currentTemp);
    stream_->Write(message);
    QThread::sleep(2);
    currentTemp += 1.0f;
  }
  return Status::OK;
}
person Curious    schedule 20.05.2021