这是我的情况。 grpc服务器是一个异步服务器,它从其他源订阅数据。 它还为客户端提供了订阅功能,因此一旦它从其他来源接收到数据,就可以将数据推送到grpc客户端。该服务器是用Java实现的。
@Override
public StreamObserver<Message> subscribe (
StreamObserver<Message> responseObserver) {
return new StreamObserver<Message>() {
@Override
public void onNext(Message message) {
api.subscribe(message.value, Message -> {
synchronized (responseObserver) {
...
...
// get data from other source
responseObserver.onNext(Converter.create().toProtobuf(Message.class, data));
}
});
}
@Override
public void onError(Throwable t) {
log.warn("Encountered error in sub", t);
}
@Override
public void onCompleted() {
responseObserver.onCompleted();
}
};
}
我想使用python来实现grpc客户端以从该服务器进行订阅。但是,一旦python订阅了数据,它看起来就很奇怪,它立即关闭而无需等待Java服务器的异步返回。但是,Java客户端可以永远运行,并等待来自服务器的异步数据。
原始
message Message{
string value = 1;
}
service test {
rpc subscribe(stream Message) returns (stream Message) {}
}
Python客户端代码(不起作用)
def gen_message():
yield test.Message(value="2")
def run():
channel = grpc.insecure_channel('localhost:50051')
stub = test_grpc.MessengerStub(channel)
stream = stub.subscribe(gen_message())
try:
for e in stream:
print(e)
except grpc._channel._Rendezvous as err:
print(err)
run()
正在运行的Java代码
StreamObserver<Message> requestObserver = stub.subscribe(new StreamObserver<Message>() {
@Override
public void onNext(Message message) {
System.out.println(message)
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onCompleted() {
}
});
Message message = Message.newBuilder().build();
requestObserver.onNext(message);
我很困惑。如何在python客户端中实现相同的功能? 谢谢〜
p.s。如果该服务器是异步服务器以外的True服务器,则python客户端可以工作。我怀疑python客户端不知道“异步”服务器,并且一旦其流中没有新数据,它将关闭连接。