优雅的结束goroutine
2017-10-13 15:06
120 查看
话不多说,先贴代码
搞一个单独的线程用来接收需要监听的结束信号,这里只监听了SIGINT和SIGTERM;接收到结束信号后,发送一个关闭的信号;所有需要优雅关闭协程的goroutine都监听这个信号,一旦接收到这个信号,就退出。注意这里如果select case中有多个case条件满足的话,系统会随机选择一个select case执行,所以可能等多一会儿。
package main import ( "time" "os" "os/signal" "fmt" "syscall" "sync" ) type Task struct { closed chan struct{} wg sync.WaitGroup ticker *time.Ticker } func (t *Task) Stop() { close(t.closed) } func (t *Task) Run(i int) { fmt.Println("start id =",i) for { select { case value,ok :=<-t.closed: fmt.Println("get closed value=", value,"ok=",ok) return case <-t.ticker.C: handle() } } } func handle() { for i := 0; i < 25; i++ { fmt.Print("#") time.Sleep(time.Millisecond * 200) } fmt.Println() } func main() { task := &Task{ closed: make(chan struct{}), ticker: time.NewTicker(time.Second * 6), } c := make(chan os.Signal) signal.Notify(c, syscall.SIGINT,syscall.SIGTERM) go func() { select { case sig := <-c: fmt.Printf("Got %s signal. Aborting...\n", sig) //task.Stop() close(task.closed) } }() //task.wg.Add(10) //for i := 0; i < 10; i++ { // go func(i int) { // defer task.wg.Done() // task.Run(i) // }(i) //} //task.wg.Wait() //fmt.Println("end") task.Run(1)
搞一个单独的线程用来接收需要监听的结束信号,这里只监听了SIGINT和SIGTERM;接收到结束信号后,发送一个关闭的信号;所有需要优雅关闭协程的goroutine都监听这个信号,一旦接收到这个信号,就退出。注意这里如果select case中有多个case条件满足的话,系统会随机选择一个select case执行,所以可能等多一会儿。
相关文章推荐
- 如何优雅的研究 RGSS3 (二) 为游戏结束画面添加简单的选项
- Android java 中如何优雅的结束线程
- 如何优雅的控制goroutine的数量
- Android java 中如何优雅的结束线程
- Android java 中如何优雅的结束线程
- 如何优雅的退出goroutine
- golang select 退出结束goroutine
- java性能优化之三 优雅平滑的结束quarts 任务
- [转]python执行bash指令,如果指令返回错误,如何优雅的结束python程序
- windows 优雅的结束应用程序
- Android java 中如何优雅的结束线程
- 优雅的结束一个线程
- Java中如何优雅的结束线程
- java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期
- Android java 中如何优雅的结束线程
- Android java 中如何优雅的结束线程
- Qt优雅地结束线程
- 如果优雅地处理多个请求并在请求结束后统一处理
- windows 优雅的结束应用程序
- Android java 中如何优雅的结束线程