美文网首页
Golang 多核并行

Golang 多核并行

作者: L白水飘萍 | 来源:发表于2019-02-01 20:08 被阅读0次

    并行和并发

    并发:一个处理器依次处理多个任务。并发一般是被内核通过时间片或者中断来控制的,遇到io阻塞或者时间片用完的时会转移线程的使用权。


    image.png

    并行:多个处理器或者是多核的处理器同时处理多个不同的任务。一个核的情况下不可能有并行的情况,因为同一时间只有一个任务在调度。

    image.png

    Golang的并行

    Golang默认情况下都是使用一个cpu来执行goroutine的任务,所以在默认的情况下并不能执行并发任务。如果想使用多核并行的任务,可以通过runtime.GOMAXPROCS()来设置CPU的个数的个数,当然这个数不能超过计算机拥有的CPU 。

    一个简单的多核处理多任务的案例

    func DoTask(wg *sync.WaitGroup) int {
        n := 2
        for i := 0; i < 20000; i++ {
            for j := 0; j < 100000; j++ {
                if n > 1000000 {
                    n = n - 10000000
                } else {
                    n++ 
                }   
            }   
        }   
        (*wg).Done()
        return n
    }
    func DoTasks(x int) {
        runtime.GOMAXPROCS(x)
        var wg sync.WaitGroup
        start := time.Now().UnixNano()
        for i := 0; i < 12; i++ {
            wg.Add(1)
            go DoTask(&wg)
        }   
     
        wg.Wait()
        fmt.Println("cpu", x, time.Now().UnixNano()-start, "ns")
    }
    func main() {
        for i := 1; i <= 8; i++ {
            DoTasks(i)
        }   
    }
    

    Out:

    cpu 1 20926279682 ns
    cpu 2 10630461280 ns
    cpu 3 7169233923 ns
    cpu 4 6381706481 ns
    cpu 5 6257451468 ns
    cpu 6 5511429381 ns
    cpu 7 5656876595 ns
    cpu 8 5336274087 ns
    
    

    可以看到随着cpu数量的增加运行的时间也相对的简少,但是当cpu数量大于4后,其运行的时间也就趋向于稳定,这是当设置的cpu数量系统的实际cpu,系统会默认的将GOMAXPROCS设置为系统的最大CPU。另外我们也可以通过top命令过程程序,可以发现CPU的使用率最终会稳定在400%附近。

    1549021986175.png

    相关文章

      网友评论

          本文标题:Golang 多核并行

          本文链接:https://www.haomeiwen.com/subject/myodsqtx.html