golang协程如何关闭

互联网 19-12-28

1、通过Channel传递退出信号

channel作为go的一种基本数据类型,它有3种基本状态:nil、open、closed。

通过Channel共享数据,而不是通过共享内存共享数据。主流程可以通过channel向任何goroutine发送停止信号,就像下面这样:

func run(done chan int) {         for {                 select {                 case <-done:                         fmt.Println("exiting...")                         done <- 1                         break                 default:                 }                   time.Sleep(time.Second * 1)                 fmt.Println("do something")         } }   func main() {         c := make(chan int)           go run(c)           fmt.Println("wait")         time.Sleep(time.Second * 5)           c <- 1         <-c           fmt.Println("main exited") }

2、使用waitgroup

通常情况下,我们像下面这样使用waitgroup:

1、创建一个Waitgroup的实例,假设此处我们叫它wg

2、在每个goroutine启动的时候,调用wg.Add(1),这个操作可以在goroutine启动之前调用,也可以在goroutine里面调用。当然,也可以在创建n个goroutine前调用wg.Add(n)

3、当每个goroutine完成任务后,调用wg.Done()

4、在等待所有goroutine的地方调用wg.Wait(),它在所有执行了wg.Add(1)的goroutine都调用完wg.Done()前阻塞,当所有goroutine都调用完wg.Done()之后它会返回。

type Service struct {         // Other things           ch        chan bool         waitGroup *sync.WaitGroup }   func NewService() *Service { 	s := &Service{                 // Init Other things                 ch:        make(chan bool),                 waitGroup: &sync.WaitGroup{}, 	}   	return s }   func (s *Service) Stop() {         close(s.ch)         s.waitGroup.Wait() }   func (s *Service) Serve() {         s.waitGroup.Add(1)         defer s.waitGroup.Done()           for {                 select {                 case <-s.ch:                         fmt.Println("stopping...")                         return                 default:                 }                 s.waitGroup.Add(1)                 go s.anotherServer() 	} } func (s *Service) anotherServer() {         defer s.waitGroup.Done()         for {                 select {                 case <-s.ch:                         fmt.Println("stopping...")                         return                 default:                 }                   // Do something         } }   func main() {           service := NewService()         go service.Serve()           // Handle SIGINT and SIGTERM.         ch := make(chan os.Signal)         signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)         fmt.Println(<-ch)           // Stop the service gracefully.         service.Stop() }

更多golang知识请关注golang教程栏目。

以上就是golang协程如何关闭的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: golang
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:golang的编译器是什么

相关资讯