程序大致逻辑如下,会正常运行一段时间,receiving msg和sleeping会交替打印,但运行一段时间后最后输出一段pipeline sleeping之后就再也没有日志了,没有pipeline terminate,没有 panic,也没有到 defer 那一步
var sigChan = make(chan os.Signal, 1) func init() { signal.Notify( sigChan, os.Kill, os.Interrupt, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, ) } func (ip *InnerPipeline) Run() { defer func() { log.Infof("pipeline<%s> defer exit", ip.name) }() for { select { case im := <-ip.messageQueue: log.Debugf("receiving msg %+v", im) // some logic .... xxxxxxxxxxxxxxx log.Debugf("quit case") case <-sigChan: log.Infof("pipeline terminate") return default: log.Debugf("current chan len: %d", len(ip.messageQueue)) // some logic .... xxxxxxxxxxxxxxx log.Debugf("pipeline<%s> sleeping...", ip.name) time.Sleep(50 * time.Millisecond) } } } 