1、实验环境
Vmvare虚拟机:单处理器2核。
2、Python获取CPU使用率
import psutildef get_cpu_percent():cpu_percent = psutil.cpu_percent(interval=1)return cpu_percentwhile(1):cpu_percent = get_cpu_percent()print("当前CPU占用率:{}%".format(cpu_percent))
3、多线程
import threading
def cpu_intensive_task():while True:pass# 创建多个线程并启动
for _ in range(10):thread = threading.Thread(target=cpu_intensive_task)thread.start()# 等待所有线程执行结束
for thread in threading.enumerate():if thread != threading.current_thread():thread.join()
多线程——实验结果
如下图所示,CPU占用率为50左右。
3、多进程
import multiprocessingdef cpu_intensive_task():while True:# 执行一些需要大量计算的任务pass# 创建多个进程并启动
for _ in range(2):process = multiprocessing.Process(target=cpu_intensive_task)process.start()# 等待所有进程执行结束
for process in multiprocessing.active_children():process.join()
多进程——实验结果
如下图所示,CPU使用率100%
结论
由于GIL的关系,python的多线程并没有发挥多核的作用,这些线程都是在在单核上跑的。
python的多线程为什么不能利用多核CPU?
如何让一个Python的脚本跑满多核的CPU
拓展——Java多线程测试
一个线程的情况
public class ThreadDemo01 extends Thread {public ThreadDemo01() {//编写子类的构造方法,可缺省}public void run() {//编写自己的线程代码while(true){int a = 0;}}public static void main(String[] args) {ThreadDemo01 thread01 = new ThreadDemo01();//ThreadDemo01 thread02 = new ThreadDemo01();thread01.setName("自定义的线程1");thread01.start();//thread02.setName("自定义的线程2");//thread02.start();//main线程System.out.println(Thread.currentThread().toString());}}
测试结果
单线程的情况下CPU使用率为50%左右
两个线程的情况
public class ThreadDemo01 extends Thread {public ThreadDemo01() {//编写子类的构造方法,可缺省}public void run() {//编写自己的线程代码while(true){int a = 0;}}public static void main(String[] args) {ThreadDemo01 thread01 = new ThreadDemo01();ThreadDemo01 thread02 = new ThreadDemo01();thread01.setName("自定义的线程1");thread01.start();thread02.setName("自定义的线程2");thread02.start();//main线程System.out.println(Thread.currentThread().toString());}
}
测试结果
结论
JAVA的多线程和Python不同,可以充分利用多核性能。