[英]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,所以一切都是事件驅動的。
我們可以使用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.