Go基础知识学习(7) 并发
#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 = ",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 #参考文献
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |