美文网首页
多线程 并发

多线程 并发

作者: 遇见你_17be | 来源:发表于2019-01-23 10:35 被阅读0次

goroutine

sync.WaitGroup

其实 go 里面也提供了更简单的方式 —— 使用 sync.WaitGroup。

WaitGroup 顾名思义,就是用来等待一组操作完成的。WaitGroup 内部实现了一个计数器,用来记录未完成的操作个数,它提供了三个方法:

Add() 用来添加计数

Done() 用来在操作结束时调用,使计数减一

Wait() 用来等待所有的操作结束,即计数变为 0,该函数会在计数不为 0 时等待,在计数为 0 时立即返回

package main

 import(

   "fmt"

  "sync"

 )

 func main() {

  var wg sync.WaitGroup

  wg.Add(2) //因为有两个动作,所以增加2个计数

  go func() {

    fmt.Println("Goroutine 1")

    wg.Done() //操作完成,减少一个计数

  }()

  go func() {

    fmt.Println("Goroutine 2")

    wg.Done() //操作完成,减少一个计数

  }()

  wg.Wait() //等待,直到计数为0

}

管道实现同步

package main

 import(

   "fmt"

 )

 func main() {

   ch := make(chan struct{})

  count := 2 //count 表示活动的协程个数

  go func() {

    fmt.Println("Goroutine 1")

    ch <- struct{}{} //协程结束,发出信号

  }()

  go func() {

    fmt.Println("Goroutine 2")

    ch <- struct{}{} //协程结束,发出信号

  }()

  for range ch {

    //每次从ch中接收数据,表明一个活动的协程结束

    count--

    //当所有活动的协程都结束时,关闭管道

    ifcount == 0 {

      close(ch)

    }

  }

}

Sleep 一段时间

package main

 import(

   "fmt"

  "time"

 )

 func main() {

   go func() {

    fmt.Println("Goroutine 1")

  }()

  go func() {

    fmt.Println("Goroutine 2")

  }()

  time.Sleep(time.Second * 1) //睡眠1秒,等待上面两个协程结束

}

相关文章

网友评论

      本文标题:多线程 并发

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