grpc-go 双向流的正确中断姿势到底是怎样的?

发布于 2022-09-04 12:13:34 字数 724 浏览 26 评论 0

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 啊?

etcd 客户端 watcher 源码
etcd 服务端 watcher 源码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小ぇ时光︴ 2022-09-11 12:13:34

服务器端,直接返回即可关闭流。https://github.com/grpc/grpc-...
客户端在调用函数获取流时,会让你传入一个ctx,你传一个withCancel的ctx。需要关闭流时Cancel掉这个ctx就可以了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文