golang 天生語言層面支持并發, 非常棒的語言, 有時我們業務開發時, 遇到復雜場景, 需要用于并發, 將多個請求使用協程組完成并發, 當遇到嵌套循環,還存在上下文關系需要改造為并發請求, 將之前的時間復雜度為O(n^2)改為O(n)的時間復雜度, 那是否還能否并時間復雜度進一步降為O(1)呢? 就出現嵌套并發. 具體如何嵌套并發, 如何寫. 今天就一步一步分析.
串行執行
- 時間復雜度為O(n^2)
- 不使用并發
- 結果執行時間為 9s
// 串行執行
func SerializeRun() {
start := time.Now()
xx := []int{1, 2, 3}
yy := []int{100, 200, 300}
for _, x := range xx {
for _, y := range yy {
abc(x, y)
}
}
fmt.Printf("串行執行總時間:%s\n", time.Since(start))
}
func abc(x, y int) {
time.Sleep(time.Second * 1)
fmt.Printf("x:%d, y:%d\n", x, y)
}
執行結果
x:1, y:100
x:1, y:200
x:1, y:300
x:2, y:100
x:2, y:200
x:2, y:300
x:3, y:100
x:3, y:200
x:3, y:300
串行執行總時間:9.0026338s
單協程組并發
- 使用了協程組將O(n^2)降為O(n)
- 結果執行時間為 3s
// 單并行執行
func SingleConcurrenceRun() {
start := time.Now()
xx := []int{1, 2, 3}
yy := []int{100, 200, 300}
for _, x := range xx {
wgg := sync.WaitGroup{}
for _, y := range yy {
wgg.Add(1)
go func(x, y int) {
defer wgg.Done()
abc(x, y)
}(x, y)
}
wgg.Wait()
}
fmt.Printf("單并行執行總時間:%s\n", time.Since(start))
}
func abc(x, y int) {
time.Sleep(time.Second * 1)
fmt.Printf("x:%d, y:%d\n", x, y)
}
結果
x:1, y:300
x:1, y:200
x:1, y:100
x:2, y:100
x:2, y:200
x:2, y:300
x:3, y:300
x:3, y:100
x:3, y:200
單并行執行總時間:3.0013813s
嵌套并發執行
- 使用嵌套協程組執行并發.
- 將O(n^2)降到O(1)
- 結果執行時間為 1s
// 嵌套執行
func NestConcurrenceRun() {
xx := []int{1, 2, 3}
yy := []int{100, 200, 300}
start := time.Now()
wgg := sync.WaitGroup{}
for _, x := range xx {
wgg.Add(1)
go func(x int) {
wg := sync.WaitGroup{}
for _, y := range yy {
wg.Add(1)
go func(x, y int) {
defer wg.Done()
abc(x, y)
}(x, y)
}
wg.Wait()
wgg.Done()
}(x)
}
wgg.Wait()
fmt.Printf("嵌套并發執行總時間:%s\n", time.Since(start))
}
func abc(x, y int) {
time.Sleep(time.Second * 1)
fmt.Printf("x:%d, y:%d\n", x, y)
}
結果
x:1, y:200
x:3, y:300
x:3, y:200
x:1, y:300
x:2, y:200
x:1, y:100
x:2, y:300
x:2, y:100
x:3, y:100
嵌套并發執行總時間:1.0023542s
以上就是詳解Go 并發的詳細內容,更多關于Go 并發的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- 詳解Go多協程并發環境下的錯誤處理
- Django高并發負載均衡實現原理詳解
- golang并發編程的實現
- 一百行Golang代碼實現簡單并發聊天室
- 基于Django的樂觀鎖與悲觀鎖解決訂單并發問題詳解
- django解決訂單并發問題【推薦】
- golang并發ping主機的方法
- golang并發下載多個文件的方法
- Go并發調用的超時處理的方法