詳解Go 并發(fā)
golang 天生語(yǔ)言層面支持并發(fā), 非常棒的語(yǔ)言, 有時(shí)我們業(yè)務(wù)開(kāi)發(fā)時(shí), 遇到復(fù)雜場(chǎng)景, 需要用于并發(fā), 將多個(gè)請(qǐng)求使用協(xié)程組完成并發(fā), 當(dāng)遇到嵌套循環(huán),還存在上下文關(guān)系需要改造為并發(fā)請(qǐng)求, 將之前的時(shí)間復(fù)雜度為O(n^2)改為O(n)的時(shí)間復(fù)雜度, 那是否還能否并時(shí)間復(fù)雜度進(jìn)一步降為O(1)呢? 就出現(xiàn)嵌套并發(fā). 具體如何嵌套并發(fā), 如何寫(xiě). 今天就一步一步分析.
串行執(zhí)行
- 時(shí)間復(fù)雜度為O(n^2)
- 不使用并發(fā)
- 結(jié)果執(zhí)行時(shí)間為 9s
// 串行執(zhí)行 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("串行執(zhí)行總時(shí)間:%s\n", time.Since(start)) } func abc(x, y int) { time.Sleep(time.Second * 1) fmt.Printf("x:%d, y:%d\n", x, y) }
執(zhí)行結(jié)果
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
串行執(zhí)行總時(shí)間:9.0026338s
單協(xié)程組并發(fā)
- 使用了協(xié)程組將O(n^2)降為O(n)
- 結(jié)果執(zhí)行時(shí)間為 3s
// 單并行執(zhí)行 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("單并行執(zhí)行總時(shí)間:%s\n", time.Since(start)) } func abc(x, y int) { time.Sleep(time.Second * 1) fmt.Printf("x:%d, y:%d\n", x, y) }
結(jié)果
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
單并行執(zhí)行總時(shí)間:3.0013813s
嵌套并發(fā)執(zhí)行
- 使用嵌套協(xié)程組執(zhí)行并發(fā).
- 將O(n^2)降到O(1)
- 結(jié)果執(zhí)行時(shí)間為 1s
// 嵌套執(zhí)行 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("嵌套并發(fā)執(zhí)行總時(shí)間:%s\n", time.Since(start)) } func abc(x, y int) { time.Sleep(time.Second * 1) fmt.Printf("x:%d, y:%d\n", x, y) }
結(jié)果
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
嵌套并發(fā)執(zhí)行總時(shí)間:1.0023542s
以上就是詳解Go 并發(fā)的詳細(xì)內(nèi)容,更多關(guān)于Go 并發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
GoLang OS包以及File類(lèi)型詳細(xì)講解
go中對(duì)文件和目錄的操作主要集中在os包中,下面對(duì)go中用到的對(duì)文件和目錄的操作,做一個(gè)總結(jié)筆記。在go中的文件和目錄涉及到兩種類(lèi)型,一個(gè)是type File struct,另一個(gè)是type Fileinfo interface2023-03-03如何使用go-zero開(kāi)發(fā)線上項(xiàng)目
這篇文章主要介紹了如何使用go-zero開(kāi)發(fā)線上項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12淺析Go項(xiàng)目中的依賴(lài)包管理與Go?Module常規(guī)操作
這篇文章主要為大家詳細(xì)介紹了Go項(xiàng)目中的依賴(lài)包管理與Go?Module常規(guī)操作,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以跟隨小編一起學(xué)習(xí)一下2023-10-10Golang實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)Stack(堆棧)的示例詳解
在計(jì)算機(jī)科學(xué)中,stack(棧)是一種基本的數(shù)據(jù)結(jié)構(gòu),它是一種線性結(jié)構(gòu),具有后進(jìn)先出(Last In First Out)的特點(diǎn)。本文將通過(guò)Golang實(shí)現(xiàn)堆棧,需要的可以參考一下2023-04-04