我有一个C ++ gRPC客户端和Golang gRPC服务器。对于双向流,当客户端想要关闭流时,它会在调用Finish()时永久阻塞。
只有在没有错误的情况下才会发生这种情况,即服务器rpc函数返回nil
。如果服务器是用C ++编写的,我知道它会返回Status::Ok
。
如果Golang服务器返回非零错误,则Finish()函数将按预期返回。只有在没有错误的情况下才会出现此问题。
例:
。因此
service StreamTest {
rpc Get(stream StreamCommand) returns (stream Result) {}
}
message StreamCommand{
string cmd = 1;
}
message Result {
string res = 1;
}
CPP
std::unique_ptr<ClientReaderWriter<StreamCommand, Result>> readerWriter;
bool Get(Result &res) {
return readerWriter->Read(&res);
}
bool CloseClient() {
StreamCommand cmd;
cmd.set_cmd("stop");
readerWriter->Write(cmd);
readerWriter->WritesDone();
Status status = readerWriter->Finish(); // <------ BLOCKING
return status.ok();
}
我用Golang gRPC客户端测试了服务器,它工作正常。服务器应该返回除nil
错误之外的其他内容吗?我应该将此报告为错误吗?
任何帮助表示赞赏!谢谢!
我不熟悉Go,但我知道c ++层。你能用GRPC_VERBOSITY = debug和GRPC_TRACE = api运行客户端吗?这样可以更深入地了解问题。