python多线程为什么没有跑满CPU?

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不同,可以充分利用多核性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/218026.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】IO流

文章目录 一、C语言的输入与输出二、流是什么?三、CIO流1. C标准IO流2. C文件IO流 四、stringstream简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值…

区块链技术将如何影响未来的数字营销?

你是否听腻了区块链和数字营销等流行语,却不明白它们对未来意味着什么?那么,准备好系好安全带吧,因为区块链技术将彻底改变我们对数字营销的看法。从建立消费者信任到提高透明度和效率,其可能性是无限的。 让我们来探…

Docker 部署 Nacos(单机),利用 MySQL 数据库存储配置信息

前面的话 默认你已经懂 Docker、docker-compose Nacos版本:v2.2.3 MySQL 版本:8.2.0 一、下载 打开 Nacos 官网 官网地址:官网 点击手册 左侧 Nacos Docker 克隆项目到本地 # 克隆项目,如果提示连接不到 github 请自行解决 …

4-20mA高精度采集方案

下载链接!https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247557466&idx1&snb5a323285c2629a41d2a896764db27eb&chksmfcfaf28dcb8d7b9bb6211030d9bda53db63ab51f765b4165d9fa630e54301f0406efdabff0fb&token976581939&langzh_CN#rd …

SAP smartform 实现打印条形码

先在SE73里定义一个新的BARCODE,注意一定要用新的才可以,旧的是打印不出来的。 然后定义一个SMARTFORM的样式,把你定义的BARCODE放到字符样式里面去。 再做SMARTFORM就可以了,将需要作为条码的变量的格式选为该BARCODE格式&…

解决hbuilder使用android studio模拟器不能热更新

hbuilder使用android studio模拟器编,在编写代码时,不能热更新,总是需要重启虚拟机中的程序,hbuilderx的版本是3.1.22,android studio的版本是4.2.2 同时在hbuilderx中出现如下报错信息: 报错信息&#x…

位图和布隆过滤器

目录 一. 位图 1.题目: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中? 2.解析题目: 3.位图 4.代码以及测试 5.其他题目 二.布隆过滤器 1.介绍 2.实现 …

持续增长的背后,艾比森用泛微-千里聆RPA机器人为业务加速

(艾比森全球总部) 艾比森集团始创于2001年,是全球知名的至真LED显示应用与服务提供商。目前旗下设有深圳总部,艾比森东江智造中心,以及艾比森美国、德国、日本、迪拜、俄罗斯、墨西哥、巴西、中国香港等18家海内外公司…

安卓用SQLite数据库存储数据

什么是SQLite? SQLite是安卓中的轻量级内置数据库,不需要设置用户名和密码就可以使用。资源占用较少,运算速度也比较快。 SQLite支持:null(空)、integer(整形)、real(小…

PTA NeuDs_数据库题目

二.单选题 1.数据库应用程序的编写是基于数据库三级模式中的。 A.模式 B.外模式 C.内模式 D.逻辑模式 用户应用程序根据外模式进行数据操作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系 2.对创建数据库模式一类的数据库对象的授权…

计算机毕业设计 基于SpringBoot的物业管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【Docker】Docker与Kubernetes:区别与优势对比

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。   kubernetes,简称K8s&a…