文档章节

Go基础知识学习(7) 并发

michaelpan
 michaelpan
发布于 2014/08/11 16:37
字数 748
阅读 96
收藏 0

#Golang并发 Golang原生支持并发。并发的最小单位是goroutine,相互之间的通信采用channel. 这里不涉及锁等复杂的内容,先简单的弄个例子了解一下Golang并发实现的简洁。 #例子,实现slice的求和 具体步骤:创建两个goroutine 一个对slice的前一半数据求和,一个对slice后一半数据求和,最后综合两个结果 完整的代码见: https://github.com/panyingyun/gostudy/blob/master/exp10.go 这里给出片段

        runtime.GOMAXPROCS(4)
	s := make([]int64, 100000000)
	for index, _ := range s {
		s[index] = int64(index * 2)
	}
	c1 := make(chan int64)
	c2 := make(chan int64)

	go sum(s[:len(s)/2], c1, "Google")
	go sum(s[len(s)/2:], c2, "Apple")
	
	sum1 := <-c1
	fmt.Println(sum1)
	sum2 := <-c2
	fmt.Println(sum2)
	fmt.Println(sum1 + sum2)
func sum(a []int64, c chan int64, flag string) {
	//fmt.Println("a = ", a)
	fmt.Println("time = ", time.Now(), flag)
	var sum int64 = 0
	//sum := 0
	for _, v := range a {
		sum += v
	}
	fmt.Println("sum = ", sum, flag)
	fmt.Println("time = ", time.Now(), flag)
	c <- sum // send sum to c
}

#结果输出 runtime.GOMAXPROCS(1) 时结果:

Gorountine number =  2
Gorountine number =  4
time =  2014-08-13 18:19:22.8741904 +0800 CST Google
time =  2014-08-13 18:19:23.0051979 +0800 CST Apple
sum =  2499999950000000 Google
time =  2014-08-13 18:19:23.1372054 +0800 CST Google
sum =  7499999950000000 Apple
time =  2014-08-13 18:19:23.1372054 +0800 CST Apple
2499999950000000
7499999950000000
9999999900000000
total exec time =  498.0285ms

runtime.GOMAXPROCS(4) 时结果:

Gorountine number =  2
Gorountine number =  4
time =  2014-08-13 18:18:42.218865 +0800 CST Google
time =  2014-08-13 18:18:42.218865 +0800 CST Apple
sum =  2499999950000000 Google
time =  2014-08-13 18:18:42.3548728 +0800 CST Google
2499999950000000
sum =  7499999950000000 Apple
time =  2014-08-13 18:18:42.3568729 +0800 CST Apple
7499999950000000
9999999900000000
total exec time =  378.0216ms

从输出的flag("Google"和"Apple")看,无论CPU设置为1 or 4,在当前这个例子中,两个goroutine宏观上看是并发的, 因为flag交叉打印输出了。另外,runtime.GOMAXPROCS(1) 设置运行CPU为1和4时,整个程序执行的时间略有差异,CPU=4时时间略省,当然这里不能说明CPU数量和性能的关系,毕竟例子太过简单了。

#更多关于并发的例子 (1) 建立两个独立的输出自增数据的通道,主groutine从通道中取数 该例子演示 groutine和channel的使用,一个无缓冲的channel的发送和接受 具体代码:https://github.com/panyingyun/gostudy/blob/master/exp11.go (2)select语句使用的例子 该例子演示了 select 的简单使用 具体代码:https://github.com/panyingyun/gostudy/blob/master/exp12.go (3)chan的range和close操作 该代码演示了range和close操作,实现菲布拉数的输出 具体代码:https://github.com/panyingyun/gostudy/blob/master/exp13.go

#参考文献

  1. 关于《goroutine 与调度器》非常形象的介绍底层goroutine的运行机理 http://blog.go-china.org/11-golang-schedule
  2. RobPike在Google IO 2012大会 上 关于并发的介绍(DOC链接和视频链接) (1)https://talks.golang.org/2012/concurrency.slide#1 (2)https://www.youtube.com/watch?v=f6kdp27TYZs
  3. Go语言信道和goroutine的一些设计模式的简单例子 http://hit9.org/post/2013-11-18-14-57.html https://github.com/hit9/Go-patterns-with-channel
  4. Golang高并发的可能案例 http://www.cnblogs.com/ghj1976/p/3762084.html
  5. Golang goroutine实现的论文分析 http://www.cs.columbia.edu/~aho/cs6998/reports/12-12-11_DeshpandeSponslerWeiss_GO.pdf

© 著作权归作者所有

共有 人打赏支持
michaelpan
粉丝 4
博文 33
码字总数 9970
作品 0
杭州
高级程序员
私信 提问
JAVA面试题「社招篇」

1. hashcode跟equals 2. hashmap的实现原理 3. 如何扩容,为什么要扩容 4. 1.6 1.7 1.8之间的区别 5. 1.8用了树解决冲突,既然是树就有排序,那是怎么排序的 6. 1.8为什么要换成树,什么是h...

JAVA丶学习
2017/12/25
0
0
大数据开发培训:0基础学习Java编程语言有哪些知识点?

Java 技术通用、高效、具有平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,学习Java首先要知道学习知识点有哪些。在这就用加米谷大数据培训...

加米谷大数据
2018/07/25
0
0
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
2018/05/06
0
0
linux基础-总结题 (每日更新)

1,如何找出/usr/local 下面所有shell脚本文件,并设置执行权限? 解答: chmod + x 2,如何通过端口查找出进程所在目录? 解答: ss -lntup|grep 端口号 3,常用的磁盘raid有哪些?描述下原理...

邱月涛
2017/07/29
0
0
面试总被问高并发,你真的会么?

今儿和大家聊聊并发。 虽然搞了多年Java,可许多朋友一提到“并发”就头疼: 有这些困惑很正常,因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的...

方志朋
03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Perl - 获取文件项目

参考:http://www.runoob.com/perl/perl-directories.html 下面返回JSON格式的文件列表 #!/usr/bin/perluse strict;use warnings;use utf8;use feature ':5.26';require Fi......

wffger
昨天
1
0
vue组件系列3、查询下载

直接源码,虽然样式样式不好看,逻辑也不是最优,但是可以留作纪念。毕竟以后类似的功能只需要优化就可以了,不用每次都重头开始。。。 <template> <div class="pre_upload"> <div ...

轻轻的往前走
昨天
1
0
java浅复制和深复制

之前写了数组的复制,所以这里继续总结一下浅复制和深复制。 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝。 深拷贝:对基本数据类型进行值传递,对引用数据类型,...

woshixin
昨天
1
0
kubernetes 二进制包安装

环境 角色 主机名 内网 IP 集群 IP 操作系统 服务 执行目录 部署机 k8s-master master120 10.0.4.120 - CentOS kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/ et......

Colben
昨天
8
0
瑞达利欧的《原则》读后感作文2400字

瑞达利欧的《原则》读后感作文2400字: 拿到同事送的书读了几十页后,我意识到自己犯了一个错误:之前以为像《原则》这个书名,配上最成功的对冲基金经理、受用终身的教诲、傅盛引用并盛赞,...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部