golang最擅長的就是併發程式設計,使用golang可以很方便的進行併發程式設計。先看一段普通的**
輸出為package main
import (
"fmt"
"time"
)func foo(i int)
func main()
}
0 will sleep
0 wake up
1 will sleep
1 wake up
2 will sleep
2 wake up
3 will sleep
3 wake up
4 will sleep
4 wake up
大概要執行25秒的時間,因為我們的foo中休眠5s,5次迴圈,去掉其他時間至少需要25秒時間執行完成。現在,我們希望併發呼叫foo函式,很簡單,使用go關鍵字建立協程(協程比執行緒的執行更加輕量級)
在呼叫foo前使用了go,這樣就會併發執行,最後新增休眠10秒,是防止主程序結束,協程也被銷毀。下面的例子使用通道我們可以看到更優雅的解決方法。package main
import (
"fmt"
"time"
)func foo(i int)
func main()
time.sleep(10 * time.second)
}
通道屬於復合型別,我們使用make函式建立通道,通道型別是int,也就是我們可以使用該通道傳遞int型別的值。我們在主函式中向foo函式傳遞通道作為引數,當foo函式執行結束後,通過通道傳送數字1(chpackage main
import (
"fmt"
"time"
)func foo(i int, ch chan int)
func main()
count := 0
for count < 5
}
我們在生產者和消費者之間使用ch通道傳遞資料,使用reslut通道給主函式返回結果。注意觀察consumer函式和producer函式的引數列表,這裡通道引數的傳遞略有不同,指明了通道的方向,chanpackage main
import (
"fmt"
"math/rand"
)func consumer(ch
result
}func producer(ch chan
}func main()
可以看到,go語言實現併發非常簡單,借用通道,又可以在不同的協程之間方便的傳輸資料。
Golang 併發以及通道的使用方式
golang最擅長的就是併發程式設計,使用golang可以很方便的進行併發程式設計。先看一段普通的 package main import f time func foo i int func main 輸出為0 will sleep 0 wake up 1 will sleep 1 wake up...
Golang併發 goroutine和通道
goroutine 和通道 channel 實現的通訊順序程序 csp 模式 共享記憶體多執行緒模式 goroutine goroutine指每乙個併發執行的活動。main函式在主goroutine中執行。goroutine通過go關鍵字建立。gof 新建乙個goroutine呼叫f go語句本身立...
Golang併發控制 context的使用
我們已經知道waitgroup可以用於併發控制,但當遇到更複雜的場景時,例如主動取消goroutine或者使超時的goroutine自動退出等,waitgroup就無能為力。這個時候,就是context大有用武之地。包context定義了context型別,它跨api邊界和程序之間攜帶截止日期,取消...