Record

机会是留给有准备的人

执行完所有的goroutine方式

在使用goroutine时,如果未有程序阻塞主程序,在主程序执行很快的时候,往往goroutine里的程序未执行完,主程序就退出了,导致程序提早结束。所以下面二个方式可以让goroutine先执行完,主程序再退出。
第一种方式使用WaitGroup
第二种方式使用channel
如下代码:

    package main
    
    import (
        "fmt"
        "time"
        "sync"
    )
    
    func testFunc(quit chan int,i int)error{
        fmt.Println("hello world",i)
        <-quit  //写出管道
        return nil
    }
    
    func testFunc2(wg *sync.WaitGroup,i int)error{
        fmt.Println("hello world",i)
        wg.Done()
        return nil
    }
    
    func main(){
    
        //第一种方式使用WaitGroup
        //WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。
        //sync.WaitGroup只有3个方法,Add(),Done(),Wait()。
        //其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。
    
        start2 :=   time.Now()
        runTimes2 := 1000
        var wg2 sync.WaitGroup
        for i:=0;i<runTimes2 ;i++  {
            wg2.Add(1)
            go testFunc2(&wg2,i)
        }
        wg2.Wait()
    
        end2 :=time.Now()
        fmt.Println(end2.Sub(start2))
    
    
        //第二种方式使用channel
        //利用channel的写入写出阻塞,执行完释放
        start := time.Now()
        runTimes := 1000
        quit :=make(chan int)
        //执行完释放
        for i:=0;i<runTimes ;i++  {
            go testFunc(quit,i)
        }
    
        //循环写入channel
        for i := 0; i < runTimes; i++ {
            quit <- 0
        }
        end:=time.Now()
        fmt.Println(end.Sub(start))
    
    }