grpc-go中,服务器如何终止一个双向的stream?

按照 grpc-go 的文档,双向stream按如下的方式实现:

func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
    for {
        in, err := stream.Recv()
        if err == io.EOF {
            return nil
        }
        if err != nil {
            return err
        }
        key := serialize(in.Location)
                ... // look for notes to be sent to client
        for _, note := range s.routeNotes[key] {
            if err := stream.Send(note); err != nil {
                return err
            }
        }
    }
}

我现在想加入超时的机制,如果客户端在一定时间(例如30秒)内没有发送任何数据,即这里的 stream.Recv 被阻塞超过30秒,就把 stream 关了。但是我没有在文档里找到任何关于这种操作的信息,请问我该如何解决这个问题?谢谢

阅读 8.5k
1 个回答

对于ClientStream而言,可以通过context来使操作超时或被取消
但对于ServerStream 好像就只能return

我也正为这个而烦恼
这个stream不如net.Conn,后者可以close和SetDeadline

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