详解Go 并发

 更新时间:2020-09-24 15:01:23   作者:佚名   我要评论(0)

golang 天生语言层面支持并发, 非常棒的语言, 有时我们业务开发时, 遇到复杂场景, 需要用于并发, 将多个请求使用协程组完成并发, 当遇到嵌套循环,还存在上下文关系需

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

您可能感兴趣的文章:
  • 详解Go多协程并发环境下的错误处理
  • Django高并发负载均衡实现原理详解
  • golang并发编程的实现
  • 一百行Golang代码实现简单并发聊天室
  • 基于Django的乐观锁与悲观锁解决订单并发问题详解
  • django解决订单并发问题【推荐】
  • golang并发ping主机的方法
  • golang并发下载多个文件的方法
  • Go并发调用的超时处理的方法

相关文章

  • 详解Go 并发

    详解Go 并发

    golang 天生语言层面支持并发, 非常棒的语言, 有时我们业务开发时, 遇到复杂场景, 需要用于并发, 将多个请求使用协程组完成并发, 当遇到嵌套循环,还存在上下文关系需
    2020-09-24
  • Bash技巧:把变量赋值为换行符(判断文件是否以换行符结尾)

    Bash技巧:把变量赋值为换行符(判断文件是否以换行符结尾)

    变量赋值为换行符 在 bash 中,如果要把变量赋值为换行符,写为 '\n' 没有效果,需要写为 $'\n'。具体举例如下: $ newline='\n' $ echo $newline \n $ newline=$
    2020-09-24
  • MacOS下本地golang环境搭建详细教程

    MacOS下本地golang环境搭建详细教程

    安装golang 使用homebrew安装golang。homebrew是MacOS 平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等功能。开发者不需要关心依赖和文件路径。如果系
    2020-09-24
  • Linux shell传递参数实现原理及代码实例

    Linux shell传递参数实现原理及代码实例

    Shell 传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数
    2020-09-24
  • 浅析Go 字符串指纹

    浅析Go 字符串指纹

    写项目时,有时我们需要缓存, 缓存就会需要唯一的key. 常规是对字符串求md5指纹. 在golang里我们也可以使用, 目前可以计算一个字符串的crc32, md5, sha1的指纹. md5
    2020-09-24
  • Shell脚本调用另一个脚本的三种方法

    Shell脚本调用另一个脚本的三种方法

    假如有脚本 first.sh: #!/bin/bash #------------------ #@file:first.sh #------------------ echo 'your are in first file' 如何在其它Shell脚本中调用first
    2020-09-24
  • golang中为什么不存在三元运算符详解

    golang中为什么不存在三元运算符详解

    三元运算符广泛存在于其他语言中,比如: python: val = trueValue if expr else falseValue javascript: const val = expr ? trueValue : falseValue
    2020-09-24
  • Shell双引号和单引号有哪些不同

    Shell双引号和单引号有哪些不同

    1.示例 Shell在使用的过程中,经常会使双引号或者单引号将字符串括起来,也可以不使用引号来定义字符串变量。示例如下: str1="testString" //双引号 str2='testS
    2020-09-24
  • 详解使用Python写一个向数据库填充数据的小工具(推荐)

    详解使用Python写一个向数据库填充数据的小工具(推荐)

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据。 而且本次项目是数据统计展示为主要功能,并没有研发对应的
    2020-09-24
  • 区分shell中的 反引号、$()和${}

    区分shell中的 反引号、$()和${}

    1.反引号与$()用于命令替换 反引号和$()的作用相同,用于命令替换(command substitution),即完成引用的命令的执行,将其结果替换出来,与变量替换差不多。比如
    2020-09-24

最新评论