这涉及到 grpc 库。 如何在服务器上的双向流 rpc 调用中取消从流中读取下一个元素而不取消流?
这是问题的一个小代码示例以及我想要实现的目标:
#include <chrono>
#include <thread>
#include <atomic>
#include "my_service.h"
class MyServiceImpl : public MyService::Service {
public:
// Get the live reads object for ReadUntil actions
Status my_rpc_call(ServerContext* context, ServerReaderWriter<RPCResponse, RPCRequest>* stream) override {
while (stream->Read(&request)) {
// Problem: blocks forever if no request is sent from client
// do something here
}
/*
desired
// thread listening for user input
std::atomic_bool cancel_read;
std::jthread cancel_periodically_thread([&cancel_read] {
for (int i(0); true; ++i) {
std::this_thread::sleep_for(std::chrono::seconds(i)); // simulate times when user cancels read request
cancel_read = true;
}
});
while (true) {
cancel_read = false;
while (stream->Read(&request, cancel_read)) {
// Problem: blocks forever if no request is sent from client
// do something here
}
stream->Write("please input something"); // incorrect syntax, just to convey meaning
}
*/
}
}
我不想取消整个流,只需调用
stream->Read(..)
返回即可。我也不知道什么时候取消,这是由外部情况决定的,例如由用户确定。
同样的问题也适用于客户端阅读。
无法“取消”流中的特定消息。您必须阅读该消息才能接收下一条消息。您的应用程序当然可以选择不对特定消息执行任何操作。