天天看点

使用go语言及Python语言实战把多核CPU跑满

机器配置

4核CPU

单线程代码

Python代码

while True:
    print("test")      

go代码

package main

import "fmt"

func main(){
    for {
        fmt.Println("test")
    }
}      

都是死循环,如何把机器的CPU跑满

Python程序运行,top监控

使用go语言及Python语言实战把多核CPU跑满

go程序运行,top监控

使用go语言及Python语言实战把多核CPU跑满

看进程都把CPU跑满了100%,但我总共有4个CPU呢

接下来该怎么做?,上文代码中,都只有一个主线程执行,一个线程是无论如何也无法跑满多核CPU的

多线程代码

go版本,使用的是协程,GMP(超多个协程对应多个线程)

package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 0; i < 200; i++ {
        go func() {
            for {
                fmt.Println("test")
            }
        }()
    }
    time.Sleep(100 * time.Hour)
}      

go程序再次运行,top监控

使用go语言及Python语言实战把多核CPU跑满

Python版本

import threading

def say():
    while True:
        print("test")

for i in range(200):
    threading.Thread(target=say).start()      

python程序运行,top监控

使用go语言及Python语言实战把多核CPU跑满

好难啊,还没跑满CPU,可能是print打印这个不消耗CPU,那么搞点复杂的计算任务吧

多线程版本2

go版本

package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 0; i < 200; i++ {
        go func() {
            for {
                sum:=0
                for i := 1; i <= 10000000; i++ {
                    sum += i
                }
                fmt.Println(sum)
            }
        }()
    }
    time.Sleep(100 * time.Hour)
}      

可以看到CPU已经达到376%,多核CPU资源已经基本上跑满了

使用go语言及Python语言实战把多核CPU跑满
import threading

def say():
    while True:
        sum=0
        for i in range(10000000):
            sum+=i
        print(sum)

for i in range(200):
    threading.Thread(target=say).start()      

可以看到CPU使用率119%,并没有利用多核资源

使用go语言及Python语言实战把多核CPU跑满

Python多线程不能利用多核的资源,网上查找了下是因为GIL全局锁的原因,只能使用多进程

Python多进程

from multiprocessing import Process

def say():
    while True:
        sum=0
        for i in range(10000000):
            sum+=i
        print(sum)

for i in range(4):
    Process(target=say).start()      

可以看到有4个Python进程,每个Python进程CPU都达到90%左右

使用go语言及Python语言实战把多核CPU跑满

结论: go可以充分利用多核资源,Python因为GIL锁的原因多线程并不能利用多核资源,需要用到多进程方式