详解Go 并发

 更新时间:2020年09月03日 08:51:09   作者:百里江山  
这篇文章主要介绍了Go 并发的相关资料,帮助大家更好的理解和学习go语言,感兴趣的朋友可以了解下

golang 天生语言层面支持并发, 非常棒的语言, 有时我们业务开发时, 遇到复杂场景, 需要用于并发, 将多个请求使用协程组完成并发, 当遇到嵌套循环,还存在上下文关系需要改造为并发请求, 将之前的时间复杂度为O(n^2)改为O(n)的时间复杂度, 那是否还能否并时间复杂度进一步降为O(1)呢? 就出现嵌套并发. 具体如何嵌套并发, 如何写. 今天就一步一步分析.

串行执行

  1. 时间复杂度为O(n^2)
  2. 不使用并发
  3. 结果执行时间为 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

单协程组并发

  1. 使用了协程组将O(n^2)降为O(n)
  2. 结果执行时间为 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

嵌套并发执行

  1. 使用嵌套协程组执行并发.
  2. 将O(n^2)降到O(1)
  3. 结果执行时间为 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 并发的资料请关注脚本之家其它相关文章!

相关文章

  • Golang操作excel的方法

    Golang操作excel的方法

    这篇文章主要介绍了Golang操作excel的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Golang标准库unsafe源码解读

    Golang标准库unsafe源码解读

    这篇文章主要为大家介绍了Golang标准库unsafe源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go Interface接口初学者手册

    Go Interface接口初学者手册

    这篇文章主要为大家介绍了Go Interface接口的基础用法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言如何使用 Viper 来管理配置

    Go语言如何使用 Viper 来管理配置

    在现代软件开发中,良好的配置管理可以极大地提升应用的灵活性和可维护性,下面我们就来看看GO语言中如何使用 Viper 来管理配置吧
    2024-11-11
  • golang flag包的使用教程

    golang flag包的使用教程

    golang 的 flag 包是用于处理命令行参数的工具包,我们可以基于这个包来开发自定义的命令行工具,下面小编就来为大家介绍一下flag包的具体使用吧
    2023-09-09
  • 浅析Go中原子操作的重要性与使用

    浅析Go中原子操作的重要性与使用

    这篇文章主要带大家一起探索 Go 中原子操作的概念,了解为什么它们是重要的,以及如何有效地使用它们,文中的示例代码讲解详细,需要的可以了解下
    2023-11-11
  • Go语言中使用urfave/cli命令行框架

    Go语言中使用urfave/cli命令行框架

    这篇文章介绍了Go语言中使用urfave/cli命令行框架的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Golang并发编程之Channel详解

    Golang并发编程之Channel详解

    传统的并发编程模型是基于线程和共享内存的同步访问控制的,共享数据受锁的保护,使用线程安全的数据结构会使得这更加容易。本文将详细介绍Golang并发编程中的Channel,,需要的朋友可以参考下
    2023-05-05
  • 使用Go语言实现在项目中隐藏敏感信息

    使用Go语言实现在项目中隐藏敏感信息

    在开发项目是,用户信息管理是一个非常常见的场景,特别是当我们需要存储和处理敏感信息时,本文主要介绍了如何使用Go语言实现隐藏敏感信息,需要的可以参考下
    2024-11-11
  • Go语言中函数可变参数(Variadic Parameter)详解

    Go语言中函数可变参数(Variadic Parameter)详解

    在Python中,在函数参数不确定数量的情况下,可以动态在函数内获取参数。在Go语言中,也有类似的实现方式,本文就来为大家详细讲解一下
    2022-07-07

最新评论