golang中并发和并行的示例分析
这篇文章主要介绍了golang中并发和并行的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
什么是golang
golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其语法与 C语言相近,但并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能。
golang中默认使用一个CPU,这时程序无法并发,只能是并发。因为始终只有一个CPU在运行。
package main import ( "fmt" "runtime") //并发和并行var quit chan int = make(chan int) func loop() { for i := 0; i < 100; i++ { //为了观察,跑多些 fmt.Printf("%d ", i) } quit <- 0} func main() { runtime.GOMAXPROCS(2) // 最多使用2个核 go loop() go loop() for i := 0; i < 2; i++ { <- quit }}
runtime.GOMAXPROCS(2) 设置使用2个CPU,这才真正是并行。
补充:Go多核并行化
通过goroutine创建相同逻辑CPU核心个数的协程,将求和列表分段,分别计算后汇总。
通过runtime.NUMCPU()获得逻辑CPU个数,并计算每个协程中计算列表的下标,计算完成后,向channel中写入1。
通过向channel中读取int的个数,判断协程运行是否全部完成,之后求和即可。
package mainimport ("fmt""runtime")type Vector []float64func (v Vector) DoSome(p, i, n int, u Vector, c chan int) {sum := 0.0for ; i < n; i++ {sum += u[i]}v[p] = sumc <- 1}const NCPU = 4func (v Vector) DoAll(u Vector) {c := make(chan int, NCPU)for i := 0; i < NCPU; i++ {fmt.Println(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU)go v.DoSome(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU, u, c)}for i := 0; i < NCPU; i++ {<-c}sum := 0.0for _, value := range v {sum += value}fmt.Println(sum)}func main() {u := make([]float64, 64)for i := 0; i < 64; i++ {u[i] = float64(i)}var v Vector = make([]float64, NCPU)v.DoAll(u)ncpu := runtime.NumCPU()fmt.Println(ncpu)}
感谢你能够认真阅读完这篇文章,希望小编分享的“golang中并发和并行的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341