Go 中的并发和并行

并行是指同一时间做多件事情,并发是指同一时间具有做多件事情的能力。在很多情况下,并发的效果比并行好,因为操作系统的硬件资源和总资源是很少而且固定的,不能无限去扩张。Go 语言设计的时候应该也是推崇这种使用较少资源做更多事情的哲学。

并发执行

Go 语言中可以使用系统功能设置可以使用的物理处理器(核),如果设置为 1 的话,所有的协程会在一个核上运行。

1package main 2 3import ( 4 "fmt" 5 "runtime" 6 "sync" 7 ) 8 9var wg sync.WaitGroup 10 11func printPrime(prefix string) { 12 defer wg.Done() 13 14next: 15 for outer := 2; outer < 5000; outer++ { 16 for inner := 2; inner < outer; inner++ { 17 if outer % inner == 0 { 18 continue next 19 } 20 } 21 fmt.Printf("%s:%d\n", prefix, outer) 22 } 23 fmt.Printf("Completed", prefix) 24} 25 26func main() { 27 runtime.GOMAXPROCS(1) 28 wg.Add(2) 29 fmt.Println("Create Goroutines") 30 go printPrime("A") 31 go printPrime("B") 32 33 fmt.Println("Waiting to Finish") 34 wg.Wait() 35 36 fmt.Println("Terminating program") 37}

结果打印

1A:4513 2A:4517 3A:4519 4A:4523 5A:4547 6B:3739 7B:3761 8... 9B:4951 10B:4957 11B:4967 12B:4969 13B:4973 14B:4987 15B:4993 16B:4999 17Completed%!(EXTRA string=B)A:4549 18A:4561 19A:4567 20A:4583 21A:4591 22A:4597 23A:4603 24A:4621 25A:4637 26

也就是两个协程交替执行。

并行执行

更改 runtime.GOMAXPROCS(1)runtime.GOMAXPROCS(runtime.NumCPU()) 后,会使用硬件的多核,并行执行。

结果打印

1B:4943 2A:4951 3B:4951 4A:4957 5B:4957 6A:4967 7B:4967 8A:4969 9B:4969 10A:4973 11A:4987 12B:4973 13B:4987 14A:4993 15B:4993 16A:4999
点赞
收藏

评论区

加载中...

相关推荐

java技术遇到瓶颈?不慌,这份java全体系脑图与面试题集合可助你冲上云巅

所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生,编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的.但是当我们对并发编程有了更深刻的认识和更多的实践后.实现并发编程就有了

并发编程的基础概念

什么是线程?什么是进程?java可以开启线程吗?不能因为Java无法直接操硬件,他是运行在虚拟机上面的,什么是并发?什么是并行?并发就是多个线程去操作一个资源。并行是多个线程同时行,但是操作的资源不是同一个。线程的六个状态new(诞生)runnable(运行)Blocked(阻塞)waiiiing(等待)Tiemwaiing(超时等待)

Goroutine并发调度模型深入之实现一个协程池

并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称

Goroutine并发调度模型深度解析&手撸一个协程池

并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称

Go并发(五):WaitGroup

本篇其实是Go并发编程的补充篇章,只是用来介绍WaitGroup的使用介绍。对于Go的并发编程来说,主协程需要知道其他的协程何时结束。通常我们的做法是采用channel的方式来控制,这种做法很好,可以参见我的另外一个帖子(Go并发之channel篇:https://mp.weixin.qq.com/s/PIbgGBootc6581pHhi5ew(h

Go 并发

Go并发并发指的是同时处理多个任务的能力。并行指的是并行处理多个任务的能力。并行不一定加快运行速度,因为并行组件之间可能需要互相通信。Go中使用协程,信道来处理并发。协程Go中主要通过协程实现并发。协程是与其他函数或方法一起并发运行的函数或方法,协程可以看作是轻量级线程,但是创建成本更小,我们经常