Как добавить событие в очередь завершения grpc в C ?

#c #grpc

#c #grpc

Вопрос:

Я пытаюсь реализовать асинхронный сервер GRPC, где всякий раз, когда клиент совершает вызов, он получает неопределенный поток сообщений. Я прочитал официальную документацию. Это не распространяется на сценарий, в котором я хочу сохранить поток открытым для каждого RPC. Эта статья — https://www.gresearch.co.uk/article/lessons-learnt-from-writing-asynchronous-streaming-grpc-services-in-c / решает проблему сохранения потока открытым, по сути, снова помещая объект обработчика обратного вызова в очередь завершения.

В статье предлагается:

 if (HasData())
{
    responder_.Write(reply_, this);
}
else
{
    grpc::Alarm alarm;
    alarm.Set(completion_queue_, gpr_now(gpr_clock_type::GPR_CLOCK_REALTIME), this);
}
  

Я попытался использовать подход с объектом Alarm, как предложено в этой статье, но по какой-то причине при следующем Next вызове функции в очереди завершения я получаю ok аргумент как false — GPR_ASSERT(cq_->Next(amp;tag, amp;ok)); . В результате я должен закрыть сервер и не могу ждать в потоке, пока не будут доступны дополнительные данные.

Я могу нормально получать данные, пока else дело не будет рассмотрено.

Может кто-нибудь, пожалуйста, помочь мне определить, что я могу делать неправильно? Я не могу найти много ресурсов C на GRPC. Спасибо!

Ответ №1:

  1. Когда сигнал тревоги выходит за пределы области видимости, он сгенерирует Cancel(), в результате чего вы получите !ok в Next().

  2. если вы хотите использовать это, вам нужно будет поместить сигнал тревоги в область вашего класса и запустить его:

     std::unique_ptr<Alarm> alarm_;
  
     alarm_.reset(new Alarm);
    alarm_->Set(cq_, grpc_timeout_seconds_to_deadline(10), this);
  

из документа по тревоге::Set:

Запуск аварийного экземпляра в очереди завершения cq в указанное время.

После истечения срока действия сигнала тревоги (в крайний срок) или его отмены (см. Отмена) событие с тегом tag будет добавлено в cq. Если срок действия сигнала тревоги истек, бит успеха события будет равен true, в противном случае false (т. Е. При отмене).