本文转载请联系Golang公众号。大家好,我是Seekload。今天给大家分享一篇如何使用context和waitGroup实现程序快速优雅退出的文章!原文如下:最近在写一个“ticker”应用,每次“tick”可能会产生上千个goroutines。我想确保当应用程序终止时,它会快速而优雅地退出,即使存在处理速度较慢的特定goroutines。刚开始的时候,我使用sync.WaitGroup来实现如何输出日志的流控,但我很快意识到,如果我创建了很多goroutines,即使有一小部分没有立即返回,我的程序也会在终止时挂起..这让我重新思考context.WithCancel并了解如何重新调整我的程序以快速优雅地退出!我们可以通过构建示例程序来逐步验证,最初的示例程序并没有使用前面的技术点。packagemainimport("fmt""log""math/rand""os""os/signal""syscall""time")funcdoSomething(chchanint){fmt.Printf("Receivedjob%d\n",<-ch)}funcinit(){rand.Seed(time.Now().Unix())}funcmain(){var(closing=make(chanstruct{})ticker=time.NewTicker(1*time.Second)logger=log.New(os.Stderr,"",log.LstdFlags)batchSize=6jobs=make(chanint,batchSize))gofunc(){signals:=make(chanos.Signal,1)signal.Notify(signals,syscall.SIGTERM,os.中断)<-signalsclose(closing)}()loop:for{select{case<-closing:breakloopcase<-ticker.C:forn:=0;n
