grpc python异步实现_grpc异步双向服务器(Java/Python)

本文讨论了如何在Python中实现一个grpc客户端,以从Java异步服务器订阅数据。Java服务器能处理异步数据推送,而Python客户端在订阅后会立即关闭,除非服务器是同步的。问题在于Python客户端可能无法正确处理异步服务器的响应。
摘要由CSDN通过智能技术生成

这是我的设想。

grpc服务器是一个异步服务器,它从其他源订阅数据。

它还为客户机提供了一个订阅功能,因此一旦从其他来源接收到数据,它就可以将数据推送到grpc客户端。服务器是用Java实现的。在@Override

public StreamObserver subscribe (

StreamObserver responseObserver) {

return new StreamObserver() {

@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客户机可以永远运行,并等待来自服务器的异步数据。在

原型

^{pr2}$

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 requestObserver = stub.subscribe(new StreamObserver() {

@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客户机中实现相同的功能?

谢谢~

如果服务器是whiletrue服务器而不是异步服务器,那么python客户机可以工作。我怀疑python客户机不知道“异步”服务器,一旦它的流没有新数据,它就会关闭连接。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值