Go併發控制 channel

2021-09-09 05:38:27 字數 983 閱讀 1644

雖然上次提過的sync控制併發很簡單,但是他有一定的侷限性,他也只能控制能過讓所有的goroutine在程式結束時完成,並不能干涉各個goroutine,下面我們介紹一種更好的方式,就是利用通道;

首先先說用channel控制併發在程式結束之前完成:

func main()

ch <-sum

}()fmt.println(<-ch)利用無緩衝通道,在通道沒有接受到值之前,是不能執行fmt.println(<-ch)語句的,這也就保證了,go func 可以執行完成

其次,還能利用channel,讓兩個goroutine之間傳送資料:

func main()()

go func() ()

fmt.println(<-two)

}結果:

d:\gowork\src\learn\12\1>go run chan.go

我是二號

我是一號

100很明顯在第二個goroutine中要接收到one中的資料才能往下進行,所以也就說明只有輸出了上面的,下面的才會輸出,從而達到了控制併發的效果

最後,還可以利用chan來控制一下持續進行的協程結束:

func main()

}}()

time.sleep(10*time.second)

fmt.println("可以了,通知監控停止...")

stop <- true

time.sleep(5*time.second)

結果:

d:\gowork\src\learn\12\1>go run chan.go

goroutin監控中...

goroutin監控中...

goroutin監控中...

goroutin監控中...

goroutin監控中...

可以了,通知監控停止...

監控退出,停止了...

使用select+chan,當檢測到chan中有值的時候,協程結束

go語言高併發channel詳解

go語言中channel可以理解是乙個先進先出的佇列,通過管道進行通訊。csp 模型 傳統的併發模型主要分為 actor 模型和 csp 模型,csp 模型全稱為 communicating sequential processes,csp 模型由併發執行實體 程序,執行緒或協程 和訊息通道組成,實...

Go控制併發

目錄非同步返回結果 多路復用和超時控制 channel的關閉和廣播 任務的取消 關聯任務的取消 在 go 中可以使用 sync.mutex 或者 sync.rwmutex 來實現 sync.mutex 互斥鎖 sync.rwmutex 一種特殊型別的鎖,其允許多個唯讀操作並行執行,但寫操作會完全互斥...

go 增加併發控制的併發ping

參照anyevent coro版的ping功能實現.golang沒有方便的pop shift語法,只能自己按陣列進行計數 gorouting版本的並行ping package main import ping fmt time strconv var fin chan string 用於實現join...