golang runtime实现多核并行任务

golang runtime实现多核并行任务

 

    首先我们需要明确一下并行跟并发的区别,并发一般是被内核通过时间片或者中断来控制的,遇到io阻塞或者时间片用完的时会转移线程的使用权。一个核的情况下不可能有并行的情况,因为同一时间只有一个任务在调度。  

 

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。

http://xiaorui.cc/2016/03/05/golang-runtime%E5%AE%9E%E7%8E%B0%E5%A4%9A%E6%A0%B8%E5%B9%B6%E8%A1%8C%E4%BB%BB%E5%8A%A1/

 

    Golang默认所有的任务都在一个cpu核里,如果想使用多核来跑goroutine的任务,需要配置runtime.GOMAXPROCS。 GOMAXPROCS的数目根据自己任务量分配就可以了,有个前提是不要大于你的cpu核数。 并行比较适合那种cpu密集型计算,如果是IO密集型使用多核的化会增加cpu切换的成本。

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package main

//xiaorui.cc

 

import (

"fmt"

"runtime"

)

 

func test(c chan bool, n int) {

 

x := 0

for i := 0; i < 1000000000; i++ {

x += i

}

println(n, x)

if n == 10 {

c <- true

}

}

 

func main() {

runtime.GOMAXPROCS(3)

c := make(chan bool)

 

for i := 0; i < 200; i++ {

go test(c, i)

}

 

<-c

 

fmt.Println("main end...")

 

}

 

 

对于经常使用python multiprocessing多进程模块来跑多核多任务的我来说,不再有GIL全局锁是个很美妙的事情。   我们通过top可以看到上面的实例代码跑到了cpu 270% . 跟我们上面配置的runtime.GOMAXPROCS(3)相对应。 

对于goroutine任务的终止也是有技巧的,他不能像多进程那样,直接给kill掉。  他只能是通过类似flag信号控制,每个goroutine执行的函数逻辑里都要判断flag标示位是否为stop状态。

 

需要特意说明一点是,你在测试并发的时候,往往会把一个函数写成死循环并做计算,你虽然这段函数用go关键词并发了,但是你会发现他无法执行后面的逻辑。你需要做的是配置多核,或者是time.Sleep()。  这是为什么 ? Golang是自己管理调整goroutine,如果你的一个func始终不释放资源,那么其他的goroutine不会去抢夺资源。 当然这样的场景只有在测试时候遇到,正常场景下不可能没有中断和堵塞的情况。 

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package main

 

import (

"fmt"

"runtime"

_ "time"

)

 

var (

flag = false

str  string

)

 

func xiaorui() {

flag = true

str = "setup flag to true"

}

 

func main() {

runtime.GOMAXPROCS(1)

go xiaorui()

//time.Sleep(1 * time.Second)

       // 理论来说,当我在xiaorui()把flag 改为true后,后面的逻辑会退出.

for {

if flag {

break

}

}

fmt.Println(str)

}

 

 

 

我们不断的调整的runtime.GOMAXPROCS(num) ,会发现执行的速度越来越快,但不要超过你的cpu数,因为那是徒劳的。 同样的代码我用python multiprocessing pool也实现了一份,我在MAC和线上服务器做过测试,性能要远高于python。

你可能感兴趣的:(go)