[gRPC] 關閉異步服務器
[gRPC] 關閉異步服務器
在grpc的異步模式下,如何正確的關閉grpc服務呢?
一般來講,我們使用異步模式時grpc會寫一個主循環,輪詢所有請求
void* tag;
bool ok;
while (likely(!(*force_quit))) { // 參見代碼規范中的中斷處理
cq.Next(&tag, &ok); // 參考官網教程中的寫法
if (ok) {
switch(tag) { // 判斷收到的是哪個請求
...
}
}
else
break;
}
那怎么中斷這個循環呢?
-
設
*force_quit=true,沒用。因為cq.Next阻塞中,并不會返回。 -
參考gRPC: What is the recommended way to shut down an asynchronous server in C++? - Stack Overflow,需要分別執行
cq.Shutdown()和server.Shutdown,但我試了一下,還是會阻塞在cq.Next里。(無論cq和server哪個先Shutdown,最后都會阻塞住)
-
放棄使用
cq.Next,改為使用cq.AsyncNext(&tag, &ok, deadline)。deadline是一個時間限制,超過時限后這個函數就會返回。這樣就不用擔心cq.Next永遠阻塞的問題了。
改進后的寫法:
void* tag;
bool ok;
gpr_timespec deadline;
deadline.clock_type = GPR_TIMESPAN;
deadline.tv_sec = 1;
deadline.tv_nsec = 0;
while (likely(!(*force_quit))) { // 參見代碼規范中的中斷處理
switch(cq.AsyncNext(&tag, &ok, deadline)) {
case ServerCompletionQueue::NextStatus::GOT_EVENT:
if (ok) {
switch(tag) { // 判斷收到的是哪個請求
...
}
}
default:
break;
}
}
| 歡迎來原網站坐坐! >原文鏈接<

浙公網安備 33010602011771號