Golang之并发编程二


本文是在上一篇文章的基础上Golang之并发编程一的基础上的续篇,若是有兴趣的话,你们能够先看看上一篇的内容,也但愿能给出建议,谢谢。php

好了,那接下来继续说Golang的并发编程吧。html

多核并行化

在说到Golang的并行化时,先看看并行和并发分别是什么吧。golang

并发:是在单核cpu的基础上,线程经过时间片或者争夺和让出控制权来实现任务的切换,从而实现多个任务的执行。表面上看就好像多个任务在“同时”进行,而其实在某个时间点上,有且仅有一个任务在执行而已。编程

并行:是指多核的CPU能让同一个进程内的线程,实现真正意义上的同时运行,在理想状况下是不须要排队的(实际是线程数量每每多余cpu核数)。并发

在目前的Go编译器中,还不可以发挥多核cpu的优点,虽然经过参加goroutine能够实现多并发,简化并行代码的编写,但这些goroutine都运行在同一个CPU核心上,在一个goroutine获得时间片执行的时候,其余goroutine都会处于等待状态,因此有时候的实际效率可能并无单线程的高。.net

因此在目前的Golang版本中,咱们能够经过设置环境变量来控制使用多少个CPU核心。线程

runtime.GOMAXPROCS(16)cdn

经过设置环境变量GOMAXPROCS的cpu核数,咱们能够指定使用多少个cpu核心,另外,咱们能够经过NumCPU()的方法,来获取当前计算机的cpu核数。htm

runtime.NumCPU()blog

golang多核

出让时间片

runtime.Gosched()

当调用这个方法后,该goroutine的会让出本身的时间片让其余goroutine执行。

须要注意的还有一点:当一个goroutine发生阻塞,Go会自动地把与该goroutine处于同一系统线程的其余goroutines转移到另外一个系统线程上去,以使这些goroutines不阻塞

同步

虽然使用了channel来做为通讯手段,但仍是可能避免不了goroutine间的共享数据,因此在golang中,仍是提供了资源锁的方案

同步锁

Golang中提供了两种锁类型:sync.Mutex 、sync.RWMutex

Mutex:相似Java中的Lock,一个goroutine获取锁后其余goroutine只可以等待,不管读写操做。

RWMutex:类型Java中的读写锁,读锁占用时,锁写操做,写锁占用时,读写都锁住。

全局惟一性操做

对于全局中只须要运行一次的代码,如初始化操做,golang提供了一个Once类型来保证惟一性操做

var once sync.Once

once.Do(方法名)

调用once.Do时,其余goroutine会被阻塞,知道全局惟一的once.Do()调用结束后才继续

示例:

var a string

var once sync.Once

func setup() {

a = "hello world"

}

func doprint() {

once.Do(setup)

print(a)

}

额外阅读:golang线程同步WaitGroup

认识golang并发

简书:http://www.jianshu.com/p/76c8356a4338

相关文章
相关标签/搜索