【问题标题】:How to add an event to grpc completion queue in C++?如何在 C++ 中向 grpc 完成队列添加事件?
【发布时间】:2021-01-17 16:08:01
【问题描述】:

我正在尝试实现一个异步 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);
}

我尝试使用本文中建议的警报对象方法,但由于某种原因,在完成队列的下一个 Next 函数调用中,我得到 ok 参数为 false - GPR_ASSERT(cq_->Next(&tag, &ok));。结果,我不得不关闭服务器并且无法等待流,直到有更多数据可用。

else 案例未命中之前,我可以正常接收数据。

有人可以帮我确定我可能做错了什么吗?我无法在 GRPC 上找到很多 C++ 资源。谢谢!

【问题讨论】:

    标签: c++ grpc


    【解决方案1】:
    1. 当 Alarm 超出范围时,它将生成一个 Cancel() 导致您在 Next() 中获得 !ok。

    2. 如果你想使用它,你需要将警报放入你的类范围并触发它:

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

    来自关于 Alarm::Set: 的文档

    在指定的完成队列 cq 上触发警报实例 时间。

    一旦警报到期(在截止日期)或它被取消(请参阅取消), 带有标签标签的事件将被添加到 cq。如果警报到期,则 事件的成功位将为真,否则为假(即,在 取消)。

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多