雖然上次提過的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...