【问题标题】:gRPC async streaming client processes first message only (c++)gRPC 异步流式客户端仅处理第一条消息(c++)
【发布时间】:2020-03-29 19:58:42
【问题描述】:

我正在运行一个连接到流服务的 gRPC 客户端。服务器总是在收到客户端请求消息后立即发送至少一个响应消息。服务器可能随时发送更多消息,也可能不发送,但客户端继续处理直到关闭。一般来说,客户端的生命周期明显短于服务端,需要随时关闭。

我的目的是编写一个客户端,该客户端将对流式消息进行异步读取,直到收到停止运行的信号。这是客户端,省略了处理:

void FooClient::WatchFoo(bool& done_)
{
    WatchFooRequest request;
    WatchFooResponse reply;
    ClientContext context;
    CompletionQueue cq;
    Status status;
    void* got_tag;
    bool ok;

    std::unique_ptr<ClientAsyncReader<WatchFooResponse> >
        reader(stub_->PrepareAsyncWatchFoo(&context, request, &cq));

    reader->StartCall((void*)1);
    reader->Read(&reply, (void*)1);

    std::chrono::system_clock::time_point mytp(std::chrono::system_clock::now());

    // continue processing messages in a loop until done becomes true
    while (!done_) {
        mytp += std::chrono:seconds(1);
        auto next_status = cq.AsyncNext<std::chrono::system_clock::time_point>(&got_tag, &ok, mytp);
        if (!ok || next_status == CompletionQueue::NextStatus::SHUTDOWN) {
            break;
        }

        if (next_status == CompletionQueue::NextStatus::TIMEOUT) {
            continue;
        }

        // process reply
        // ...
    }

    context.TryCancel();

    reader->Finish(&status, (void*)1);
    cq.Shutdown();
}

我有这段代码的阻塞等效项(同步读取器->在 while 循环中调用读取),它可以正确接收所有消息。但是,异步代码似乎只获取第一条消息,而没有获取后续消息。

我可能误解了文档并做了一些蹩脚的事情,但有什么想法为什么只有第一条消息到达?

【问题讨论】:

    标签: grpc


    【解决方案1】:

    查看您的代码,我没有看到阅读器->在 while 循环中的 AsyncNext 调用之后发出读取,因此它只会收到一条消息。每个操作只匹配一条消息。

    【讨论】:

    • 感谢您的建议。如果我只是按照建议添加后续阅读器->在 AsyncNext 完成后读取,则会在最后一行 GPR_CODEGEN_ASSERT(GRPC_CALL_OK == g_core_codegen_interface- >grpc_call_start_batch(call_.call(), ops, nops, core_cq_tag(), nullptr));这反过来又调用了reuse_or_allocate_batch_control(call, ops, nops);并返回错误 GRPC_CALL_ERROR_TOO_MANY_OPERATIONS
    猜你喜欢
    • 2012-05-16
    • 2012-03-24
    • 2017-04-18
    • 1970-01-01
    • 2021-11-01
    • 2019-06-03
    • 2018-06-22
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多