簡體   English   中英

gRPC:RPC 處理程序如何正確檢測“Server”是否已被“Shutdown()”

[英]gRPC: How can RPC handlers properly detect if `Server` has been `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是否已從grpc::ServerContext Shutdown()grpc::ServerContext ,但我沒有看到任何相關的方法來實現這一點。

如果有人可以提出一種方法來完全消除 while 循環(?),那就更好了。 我正在使用 Qt,所以一切都是事件驅動的。

所以,我認為有必要明確Shutdown作用。 對此詳細評論,但基本上,服務器Shutdown不會失敗、取消或終止您現有的正在進行的調用(除非您使用截止日期參數和 gRPC C++ 異步 API)。

相反,它停止偵聽新連接、停止接受新呼叫、使請求但尚未接受的呼叫失敗。 如果您想在關機時失敗或終止您的調用,您可以像上面所做的那樣在應用程序級代碼中執行此操作。

我只是建議您不要使用全局變量,而應該使用StreamServiceImpl類的成員函數,以便您可以選擇支持在同一進程中運行的多個服務。

我們可以使用ServerContext::IsCancelled作為流式 API 中的中斷/終止標准。 我改變了GetCurrentTemperature(...)如下(只是用!context_->IsCancelled()替換了g_ServerIsNotDead )並且它起作用了:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM