Go 中的并发和并行

Wesley13
• 阅读 640

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

并发执行

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

package main 

import (
    "fmt"
    "runtime"
    "sync"
    )

var wg sync.WaitGroup

func printPrime(prefix string) {
    defer wg.Done()

next:
    for outer := 2; outer < 5000; outer++ {
        for inner := 2; inner < outer; inner++ {
            if outer % inner == 0 {
                continue next
            }
        }
        fmt.Printf("%s:%d\n", prefix, outer)
    }
    fmt.Printf("Completed", prefix)
}

func main() {
    runtime.GOMAXPROCS(1)
    wg.Add(2)
    fmt.Println("Create Goroutines")
    go printPrime("A")
    go printPrime("B")

    fmt.Println("Waiting to Finish")
    wg.Wait()

    fmt.Println("Terminating program")
}

结果打印

A:4513
A:4517
A:4519
A:4523
A:4547
B:3739
B:3761
...
B:4951
B:4957
B:4967
B:4969
B:4973
B:4987
B:4993
B:4999
Completed%!(EXTRA string=B)A:4549
A:4561
A:4567
A:4583
A:4591
A:4597
A:4603
A:4621
A:4637

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

并行执行

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

结果打印

B:4943
A:4951
B:4951
A:4957
B:4957
A:4967
B:4967
A:4969
B:4969
A:4973
A:4987
B:4973
B:4987
A:4993
B:4993
A:4999
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java技术遇到瓶颈?不慌,这份java全体系脑图与面试题集合可助你冲上云巅
所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生,编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的.但是当我们对并发编程有了更深刻的认识和更多的实践后.实现并发编程就有了
九鹤 九鹤
3年前
并发编程的基础概念
什么是线程?什么是进程?java可以开启线程吗?不能因为Java无法直接操硬件,他是运行在虚拟机上面的,什么是并发?什么是并行?并发就是多个线程去操作一个资源。并行是多个线程同时行,但是操作的资源不是同一个。线程的六个状态new(诞生)runnable(运行)Blocked(阻塞)waiiiing(等待)Tiemwaiing(超时等待)
Stella981 Stella981
3年前
Goroutine并发调度模型深入之实现一个协程池
并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称
Stella981 Stella981
3年前
Goroutine并发调度模型深度解析&手撸一个协程池
并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go语言作为一个出道以来就自带『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go语言中的并发(并行)编程是经由goroutine实现的,goroutine是golang最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称
Wesley13 Wesley13
3年前
Java 多线程(一)—— 概念的引入
并发和并行并行:指两个或多个时间在同一时刻发生(同时发生);并发:指两个或多个事件在一个时间段内发生。  在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单CPU系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替
Stella981 Stella981
3年前
Go并发(五):WaitGroup
本篇其实是Go并发编程的补充篇章,只是用来介绍WaitGroup的使用介绍。对于Go的并发编程来说,主协程需要知道其他的协程何时结束。通常我们的做法是采用channel的方式来控制,这种做法很好,可以参见我的另外一个帖子(Go并发之channel篇:https://mp.weixin.qq.com/s/PIbgGBootc6581pHhi5ew(h
Wesley13 Wesley13
3年前
Go 并发
Go并发并发指的是同时处理多个任务的能力。并行指的是并行处理多个任务的能力。并行不一定加快运行速度,因为并行组件之间可能需要互相通信。Go中使用协程,信道来处理并发。协程Go中主要通过协程实现并发。协程是与其他函数或方法一起并发运行的函数或方法,协程可以看作是轻量级线程,但是创建成本更小,我们经常
Stella981 Stella981
3年前
Go中的并发编程和goroutine
并发编程对于任何语言来说都不是一件简单的事情。Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程。1\.并行和并发并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。并发(concurrency):指在
Stella981 Stella981
3年前
Python并发(二)
并发是指一次处理多件事,而并行是指一次做多件事。二者不同,但互相有联系。打个比方:像Python的多线程,就是并发,因为Python的解释器GIL是线程不安全的,一次只允许执行一个线程的Python字节码,我们在使用多线程时,看上去像很多个任务同时进行,但实际上但一个线程在执行的时候,其他线程是处于休眠状态的。而在多CPU的服务器上,Java或Go的多线程,
Stella981 Stella981
3年前
Golang学习笔记:goroutine
1.goroutinegoroutine是go语言的并发体。在go语言里面能使用go关键字来实现并发。gofunc()1.1概念介绍goroutine本质上是协程,我刚刚学习的时候就粗略地认为goroutine是线程,直到最近才开始搞明白goroutine的基本概念。<fon