当前位置: 首页 > 知识库问答 >
问题:

如何在C++中向grpc完成队列中添加事件?

谯翔
2023-03-14

我试图实现一个异步GRPC服务器,在该服务器中,每当客户端进行调用时,它都会得到一个不确定的消息流。我通读了官方文件。它没有涵盖我希望为每个RPC保持流打开的场景。本文-https://www.gresearch.co.uk/article/cleares-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++资源。谢了!

共有1个答案

沈弘文
2023-03-14

>

  • 当Alarm超出范围时,它将生成一个Cancel(),导致您在Next()中get!ok。

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

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

    从doc on Alarm::Set:

  •  类似资料:
    • 我创建了一个用C编写的gRPC异步客户端,它使用完成队列向服务器发出流式和一元请求。 在客户机类的析构函数中,调用了完成队列的方法,然后我想我可以调用来耗尽队列并获取挂起的标记,但对的调用会阻止一切。 挂起的标签是需要的,因为它们是用创建的对象,必须删除以避免泄漏。 对异步客户机使用的队列进行排空的正确方法是什么?

    • 我有几个CSV文件如下所示: 我想添加一个新的列到所有的CSV文件,使它看起来像这样: 到目前为止,我的剧本是: (Python 3.2) 但在输出中,脚本跳过每一行,新列中只有Berry:

    • 我用JavaFx制作了两个简单的JMS应用程序(一个是发送者,另一个是接收者)。 但是,我不能用来自发送方的新消息刷新接收方的GUI。 我使用onMessage事件在internet上查找,并重写了它(向那里的ObservableList添加一个项),但它不起作用。引发事件后,没有向ObservableList添加任何元素。 这是我的听筒: 我的发件人:

    • 我正在表任务中添加新列名标题。但我得到一个错误,该表中不存在此列。谁能帮我解决那个错误。这是我的密码: 然后添加此代码 到创建的新表文件

    • 我想将我的添加到列中,这样我就可以在加载更多项目时在这个列表视图下面添加CircularProgressIndex ator。我使用了如何在Flutter中将列表视图添加到列中的建议?因此我制作了结构列- 你能告诉我我做错了什么吗?这个构建了新的小部件,但它构建在另一个列上。也许这是错的?

    • 我必须创建一个Jtextfield,用户将在其中输入大约30个字符。我已经创建了15个单独的Jtextfield,并让用户在每个Jtextfield中只输入2个字符。当用户在第一个字段中输入两个字符时,它会自动跳转到下一个字段,并持续到30个字符。 我的问题是,有没有更好的方法来创建J文本字段。我们可以创建一个J文本字段,并将其划分为15个分区,并为输入字符提供相同的流程,而不是创建单独的15个J