协程的三种同步方式Channel、Mutex、WaitGroup
生活随笔
收集整理的這篇文章主要介紹了
协程的三种同步方式Channel、Mutex、WaitGroup
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、無緩沖的channel:無緩沖的channel只能發送完之后協程立馬阻塞,只有等有協程接受了之后才能繼續發送,等待協程接受了,之后立馬阻塞,等待channel中有數據才會啟動
package mainimport ("fmt""time"
)/*
無緩沖的channel只能發送完之后協程立馬阻塞,只有等有協程接受了之后才能繼續發送,
等待協程接受了,之后立馬阻塞,等待channel中有數據才會啟動
*/
func main() {c := make(chan int) //聲明一個int類型的無緩沖通道go func() {fmt.Println("準備發送1數據")c <- 1fmt.Println("發送1數據完畢")fmt.Println("協程開始睡眠1秒")time.Sleep(time.Second)fmt.Println("協程結束睡眠")c <- 2fmt.Println("發送2數據完畢")}()fmt.Println("主線程休眠1秒")time.Sleep(time.Second)fmt.Println("主線程結束休眠")i := <-cfmt.Printf("接受 %d\n", i)i = <-cfmt.Printf("接受 %d\n", i)time.Sleep(time.Second)
}
2、有緩沖的channel:當緩沖區滿了發送線程阻塞,緩沖區空了接受線程阻塞
package mainimport ( "fmt" "time" ) /* 當緩沖區滿了發送線程阻塞,緩沖區空了接受線程阻塞 */func main() {c := make(chan int, 2) //聲明一個int類型的有緩沖通道go func() {for i := 0; i < 4; i++ {c <- ifmt.Printf("send %d\n", i)}time.Sleep(5 * time.Second)for i := 4; i < 6; i++ {c <- ifmt.Printf("send %d\n", i)}}()for i := 0; i < 6; i++ {time.Sleep(time.Second)fmt.Printf("receive %d\n", <-c)} }3、sync.Mutex
package mainimport ("fmt""sync""time" )var share_cnt uint64 = 0var lck sync.Mutexfunc incrShareCnt() {for i := 0; i < 1000000; i++ {lck.Lock()share_cnt++ //共有資源lck.Unlock()}fmt.Println(share_cnt) } func main() {for i := 0; i < 2; i++ {go incrShareCnt()}time.Sleep(1 * time.Second) //1秒 }4、sync.Waitgroup:使用等待組進行多個任務的同步,等待組可以保證在并發環境中完成指定數量的任務
package mainimport ( "fmt" "sync" ) //使用等待組進行多個任務的同步,等待組可以保證在并發環境中完成指定數量的任務 func main() {fmt.Println("Hello World")var waitgroup sync.WaitGroupwaitgroup.Add(1)go myFunc(&waitgroup)waitgroup.Wait()fmt.Println("Finished Execution") } func myFunc(waitgroup *sync.WaitGroup) {fmt.Println("Inside my goroutine")waitgroup.Done() }總結
以上是生活随笔為你收集整理的协程的三种同步方式Channel、Mutex、WaitGroup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YAML字段详解
- 下一篇: 做程序员10年了,复制粘贴是我最牛的技能