关于跟踪项目中子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
}
}
}