美文网首页Golang&Python
go 等待所有 goroutine 执行结束的方法

go 等待所有 goroutine 执行结束的方法

作者: lesliefang | 来源:发表于2017-12-02 19:16 被阅读310次

通常我们在 main 中需要等待所有的 goroutine 都执行完毕时再退出
一般有两种方法
方法一大家都能想到用 channel 进行同步

func main() {
    ch := make(chan int, 2)

    go func() {
        for i := 0; i < 10; i++ {
            time.Sleep(1 * time.Second)
            fmt.Println("go routine1", i)
        }
        ch <- 1
    }()
    go func() {
        for i := 0; i < 10; i++ {
            time.Sleep(1 * time.Second)
            fmt.Println("go routine2", i)
        }
        ch <- 2
    }()

    // 等待
    for i := 0; i < 2; i++ {
        <-ch
    }

    fmt.Println("main exist")
}

这种方法需要知道子 goroutine 的个数

方法二用 sync.WaitGroup,这也是官方推荐方法,不需要知道 gotoutine 的个数

package main

import "fmt"
import "time"
import "sync"

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            time.Sleep(1 * time.Second)
            fmt.Println(i)
        }(i)
    }

    wg.Wait() // 等待

    fmt.Println("main exist")
}

相关文章

  • go 等待所有 goroutine 执行结束的方法

    通常我们在 main 中需要等待所有的 goroutine 都执行完毕时再退出一般有两种方法方法一大家都能想到用 ...

  • Go的进程阻塞

    在Go语言中,如果使用goroutine,经常需要阻塞主进程来等待goroutine的结束,我们有以下几种方式来实...

  • go学习笔记(四)——并发

    1. goroutine 什么是goroutine goroutine是golang的最小执行单元,每个go程序至...

  • go语言之goroutine

    goroutine 当go 语句执行的时候,其中的go函数会被单独放到一个goroutine中,在这之后该go函数...

  • 一文看懂 Context

    Go 中有一个 Context 接口,配合 goroutine 使用,主要是用来协调 goroutine 的执行,...

  • GO语言基础(五)

    goroutine goroutine是由 Go 运行时管理的轻量级线程。 会启动一个新的 Go 程并执行 f, ...

  • Goroutine同步

    在goroutine执行的过程中,需要进行goroutine的同步。Go语言提供了sync包和channel机制来...

  • golang sync WaitGroup

    简介 它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。...

  • golang中等待所有goroutine执行完成.

    golang中,创建一个channel并开始执行后便脱离了主程序控制,那么,类似于其他语言中, 多线程中的每个线程...

  • goroutine剖析

    goroutine是在后台运行的轻量级执行线程,同时它也是Go中实现并发的关键。 goroutine是什么 我们在...

网友评论

    本文标题:go 等待所有 goroutine 执行结束的方法

    本文链接:https://www.haomeiwen.com/subject/uotobxtx.html