详解Go 并发

时间:2021-05-22

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 并发的资料请关注其它相关文章!

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章