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 源码

阅读 11.2k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题