Использование метода gRPC OnCancel в API обратного вызова для серверных реакторовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование метода gRPC OnCancel в API обратного вызова для серверных реакторов

Сообщение Anonymous »

Мы используем примеры, предоставленные командой gRPC, здесь https://github.com/grpc/grpc/blob/maste ... _server.cc
Существует несколько типов потоковых реакторов: ServerWriteReactor, ServerReadReactor, ServerBidiReactor.
В этих примерах есть код, который учит нас: когда соединение намеренно закрывается на стороне сервера, запускается обратный вызов OnDone(). Унаследованный класс удаляет свой экземпляр следующим образом:

Код: Выделить всё

   class Lister : public grpc::ServerWriteReactor
{
public:
...
void OnDone() override { delete this; }
....
}
Но в базовых классах есть еще одна виртуальная «обратная» функция — например. ServerWriteReactor::OnCancel(), который всегда срабатывает, когда клиент gGRPC разрывает соединение со своей стороны.
Проблема в том, что в gRPC/Example/cpp нет ни одного примера, показывающего, как правильно использовать эту функцию, если она переопределена классом пользователя.
Если мы поместим туда тот же код (удалить этот), последующий вызов grpc::Server::ShutDown() никогда не вернется, если вы хотите закрыть серверную часть формы соединения. Иногда, если поток данных используется интенсивно, мы очень скоро получаем внутреннее исключение gRPC. Таким образом, небезопасно помещать один и тот же код (удалять это) в функцию OnCancel()...
Итак, возникают вопросы:
  • как правильно обрабатывать OnCancel() в серверных реакторах потокового типа?
  • В какой момент можно безопасно удалить экземпляр серверного реактора после того, как мы получили OnCancel() сработало?


Подробнее здесь: https://stackoverflow.com/questions/767 ... r-reactors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»