Grpc C++:如何等到发送一元请求?

如何解决Grpc C++:如何等到发送一元请求?

我正在编写一个围绕 gRPC 一元调用的包装器,但我遇到了一个问题:假设我有一个 ClientAsyncResponseReader 对象,它被创建并开始一个像这样的请求

response_reader_ = std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
        grpc::internal::ClientAsyncResponseReaderFactory<ResponseType>::Create(
            channel.get(),completion_queue,rpc_method,&client_context_,request,true
        )
);
response_reader_->Finish(
    response_sharedptr_.get(),status_sharedptr_.get(),static_cast<void*>(some_tag)
);
// Set a breakpoint here

其中所有参数都有效。

我的印象是,当 Finish 调用返回时,request 对象肯定已通过网络发送出去。但是,通过在 Finish() 调用之后设置断点(在客户端程序中,要清楚)并检查我的服务器的日志,我发现服务器直到我恢复后才记录 request 来自断点。

这似乎表明我需要等待其他事情才能确保请求真正发送出去:而且,执行上述代码的线程在发送请求方面仍然具有某种作用出现在断点后。

当然,也许我的假设是错误的,并且服务器不会在请求进来时立即记录请求。如果不是,那么显然我不太了解 gRPC 的语义,所以我希望获得一些更有经验的见解。

您可以查看我的一元调用抽象 here代码。它应该足够了,但如果需要其他任何东西,我很乐意提供。

编辑:情节变厚了。在服务器处理程序上为传入请求设置断点后,看起来对 Finish 的调用通常确实“确保”请求已发出:except 对于进程发送的第一个请求。我猜在 grpc::channel 或什至可能在 grpc::completion_queue 中维护了一些状态,这会延迟初始请求

解决方法

来自文档

response_reader_ = std::unique_ptr<grpc::ClientAsyncResponseReader<ResponseType>>(
        grpc::internal::ClientAsyncResponseReaderFactory<ResponseType>::Create(
            channel.get(),completion_queue,rpc_method,&client_context_,request,true
        )
);

这将开始一个呼叫并写出请求(start=true)。该函数没有标签参数。因此,完成队列无法通知呼叫开始何时完成。调用 RPC 方法有点复杂,它基本上涉及创建网络数据包并将其放入线路。如果传输出现瞬时故障或通道完全消失或用户做了一些愚蠢的事情,它可能会失败。另一件事,为什么我们需要标记通知是完成队列确实是一个争用点。所有 RPC 对象都与此对话,可能会发生完成队列未空闲且请求仍处于待处理状态。

response_reader_->Finish(
    response_sharedptr_.get(),status_sharedptr_.get(),static_cast<void*>(some_tag)

这将请求 RPC 运行时接收服务器的响应。输出是当服务器响应到达时,完成队列将通知客户端。在此刻。我们假设客户端没有错误,一切正常并且请求已经在进行中。因此对于一元 rpc,Finish call 的状态永远不会为 false。

这似乎表明我需要等待其他事情才能确保请求真正发送出去:而且,执行上述代码的线程在发送请求方面仍然具有某种作用出现在断点后。

也许,您想重用请求对象(我对此做了一些实验)。对我来说,我将请求对象保存在内存中,直到响应到达。无法保证在创建调用后不会需要请求对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?