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