取消从grpc流式rpc读取

问题描述 投票:0回答:1

这涉及到 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(..)
返回即可。我也不知道什么时候取消,这是由外部情况决定的,例如由用户确定。

同样的问题也适用于客户端阅读。

c++ multithreading grpc cancellation
1个回答
0
投票

无法“取消”流中的特定消息。您必须阅读该消息才能接收下一条消息。您的应用程序当然可以选择不对特定消息执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.