goroutine和channel是Go语言非常棒的特色,它们提供了一种非常轻便易用的并发能力。但是当您的应用进程中有很多goroutine的时候,如何在主流程中等待所有的goroutine 退出呢?

1 通过Channel传递退出信号 (推荐学习:go)

Go的一大设计哲学就是:通过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")}

这种方式可以实现优雅地停止goroutine,但是当goroutine特别多的时候,这种方式不管在代码美观上还是管理上都显得笨拙不堪。

2 使用waitgroup

sync包中的Waitgroup结构,是Go语言为我们提供的多个goroutine之间同步的好刀。下面是官方文档对它的描述:

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

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

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

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

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

更多相关文章

  1. 【发布了Go-carbon1.1.1版本】完善对主流ORM的支持,新增公共方法
  2. Python主流Web框架之Tornado
  3. 十大最主流的PHP框架
  4. 三分钟带你了解PHP四大主流框架的优缺点
  5. 让你一看就懂的PHP主流框架优缺点
  6. 速看!主流PHP框架性能非权威测试
  7. PHP多进程、信号量及孤儿进程和僵尸进程
  8. Mall电商实战项目专属学习路线,主流技术一网打尽!
  9. Java中的信号量Semaphore

随机推荐

  1. php中的chunk_split函数怎么用
  2. php中的strnatcasecmp函数怎么用
  3. php中的strnatcmp函数怎么用
  4. php rtrim函数怎么用
  5. php strrev怎么用
  6. php中的str_ireplace函数怎么用
  7. php wordwrap函数怎么用
  8. php中的str_replace函数怎么用
  9. php str_shuffle函数怎么用
  10. php中的strip_tags函数怎么用