#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:
-
Когда сигнал тревоги выходит за пределы области видимости, он сгенерирует Cancel(), в результате чего вы получите !ok в Next().
-
если вы хотите использовать это, вам нужно будет поместить сигнал тревоги в область вашего класса и запустить его:
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 (т. Е. При отмене).