grpc-go 双向流的正确中断姿势到底是怎样的?
grpc-go 没有提供任何超时的搞法,关于关闭连接只有客户端的 CloseSend. 以客户端为例,通常会在两个 goroutine 里同时进行 Send 和 Recv ,现在 Send 那边 CloseSend 了,可是 Recv 这边不会有任何通知。而且 Recv 是阻塞的且没有超时,所以我也没法用外部的 context 来控制。难道只能由服务端在发现这边半关闭之后直接 return 退出 goroutine?
etcd 的 watcher 用的就是 grpc 的双向流,我看了一眼源码,惊呆了,它没有处理任何 Send 返回的错误(服务端是获取了 error 但是没有把这个值返回上层,客户端是根本没捕获这个 error),无论是客户端还是服务端。客户端也没有调用 CloseSend,而是从 ClientStream.Context() WithCancel 衍生出了一个 cancel 函数用的,可是这个产生的 cancel 控制的是子 context,子 context 取消了并不会影响父 context 啊?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
服务器端,直接返回即可关闭流。https://github.com/grpc/grpc-...
客户端在调用函数获取流时,会让你传入一个ctx,你传一个withCancel的ctx。需要关闭流时Cancel掉这个ctx就可以了。