机器配置
4核CPU
单线程代码
Python代码
whileTrue: print("test")
go代码
packagemainimport"fmt"funcmain(){ for { fmt.Println("test") } }
都是死循环,如何把机器的CPU跑满
Python程序运行,top监控
go程序运行,top监控
看进程都把CPU跑满了100%,但我总共有4个CPU呢
接下来该怎么做?,上文代码中,都只有一个主线程执行,一个线程是无论如何也无法跑满多核CPU的
多线程代码
go版本,使用的是协程,GMP(超多个协程对应多个线程)
packagemainimport ( "fmt""time") funcmain() { fori :=0; i<200; i++ { gofunc() { for { fmt.Println("test") } }() } time.Sleep(100*time.Hour) }
go程序再次运行,top监控
Python版本
importthreadingdefsay(): whileTrue: print("test") foriinrange(200): threading.Thread(target=say).start()
python程序运行,top监控
好难啊,还没跑满CPU,可能是print打印这个不消耗CPU,那么搞点复杂的计算任务吧
多线程版本2
go版本
packagemainimport ( "fmt""time") funcmain() { fori :=0; i<200; i++ { gofunc() { for { sum:=0fori :=1; i<=10000000; i++ { sum+=i } fmt.Println(sum) } }() } time.Sleep(100*time.Hour) }
go程序运行,top监控
可以看到CPU已经达到376%,多核CPU资源已经基本上跑满了
Python版本
importthreadingdefsay(): whileTrue: sum=0foriinrange(10000000): sum+=iprint(sum) foriinrange(200): threading.Thread(target=say).start()
python程序运行,top监控
可以看到CPU使用率119%,并没有利用多核资源
Python多线程不能利用多核的资源,网上查找了下是因为GIL全局锁的原因,只能使用多进程
Python多进程
frommultiprocessingimportProcessdefsay(): whileTrue: sum=0foriinrange(10000000): sum+=iprint(sum) foriinrange(4): Process(target=say).start()
python程序运行,top监控
可以看到有4个Python进程,每个Python进程CPU都达到90%左右
结论: go可以充分利用多核资源,Python因为GIL锁的原因多线程并不能利用多核资源,需要用到多进程方式