机器配置
4核CPU
单线程代码
Python代码
while True:
print("test")
go代码
package main
import "fmt"
func main(){
for {
fmt.Println("test")
}
}
都是死循环,如何把机器的CPU跑满
Python程序运行,top监控
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLkNjY3cTOjBzMwgDZtMmM4IWL2UmY00yMxI2YtQzNlhDZhJGNtYDN2EjN0YDM0UzM2EzLcNTO2IjM3IzLcdmbw9CXxIDMy8CXw8CXlVXc1l3Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
go程序运行,top监控
看进程都把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监控
Python版本
import threading
def say():
while True:
print("test")
for i in range(200):
threading.Thread(target=say).start()
python程序运行,top监控
好难啊,还没跑满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资源已经基本上跑满了
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%,并没有利用多核资源
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因为GIL锁的原因多线程并不能利用多核资源,需要用到多进程方式