关于跟踪项目中子goroutine错误的疑问

工作中在维护一个项目,但是会经常因为一个错误而浪费大量时间去定位,所以想引入context包来进行错误跟踪,问题如下:

  • gRPC服务阻塞住了导致其他程序无法调,应该如何解决这个问题?
  • 当子goroutine中任意位置出错则将err写入errCh中返回
func (rs *RS) Run() error {
    var wg sync.WaitGroup
    errCh := make(chan error, 1)
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    wg.Add(6)
    for _, robot := range rs.Robots {    // len(Robots) = 6
        func() {
            defer wg.Done()
            go robot.Start(ctx, errCh)
        }()
    }

    wg.Wait()
    select {
    case e := <-errCh:
        if e != nil {
            return e
        }
    }
    return nil
}
func (s *Server) Start(ctx context.Context, errCh chan error) {
    lis, err := net.Listen("tcp", s.addr)
    select {
    case <-ctx.Done():
        return
    case errCh <- err:
        return
    default:
        s.server = grpc.NewServer()
        proto.RegisterSendCommandServer(s.server, s)
        reflection.Register(s.server)
        err := s.server.Serve(lis)
        if err != nil {
            errCh <- err
        }
    }
}
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!