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

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

查看回复