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

news2024/11/15 22:45:10

1、实验环境

Vmvare虚拟机:单处理器2核。

2、Python获取CPU使用率

import psutil

def get_cpu_percent():
    cpu_percent = psutil.cpu_percent(interval=1)
    return cpu_percent

while(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 multiprocessing

def 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.coloradmin.cn/o/1252103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyCharm 安装插件Vue

一、打开PyCharm工具 File -> Settings -> Plugins 二、在项目中添加Vue.js的依赖项。 npm install vue 三、页面应用

我的第一个Arduino点灯程序

我简直难以相信,什么都不用配置,就这么几行代码,就可以blink了 void setup() {// Set up the built-in LED pin as an output:pinMode(PA1, OUTPUT); }void loop() {digitalWrite(PA1,!digitalRead(PA1));// Turn the LED from off to on, o…

3. 深入探究文件 IO

3. 深入探究文件 IO 1. Linux 系统如何管理文件1.1 静态文件与inode1.2 文件打开时的状态 2. 返回错误处理与errno2.1 strerror 函数2.2 perror 函数 3. 空洞文件4. O_APPEND 和 O_TRUNC5. 多次打开同一个文件6. 复制文件描述符6.1 dup6.2 dup2 7. 文件共享7.1 同一个进程中多次…

接口测试场景:怎么实现登录之后,需要进行昵称修改?

在接口测试中有一个这样的场景:登录之后,需要进行昵称修改,怎么实现? 首先我们分别看下登录、昵称修改的接口说明: 以上业务中补充一点,昵称修改,还需要添加请求头Authorization传登录获取的to…

Depends 下载

查看某个应用程序和动态库的依赖 属性查看是只支持WIN32 的,查看X64的动态库电脑会卡死 左边框可以查看动态库的依赖,右边 可以查看动态库的导出情况 链接:https://pan.baidu.com/s/1vUFrOuzTO_dfvvkHP0-UiQ 提取码:i09s

2. 流程控制|方法|数组|二维数组|递归

文章目录 流程控制代码块选择结构循环结构跳转控制关键字 方法方法的概述方法的重载Junit单元测试初识全限定类名 Debug 小技巧数组数组的基本概念数组的基本使用数组的声明数组的初始化 JVM内存模型什么是引用数据类型基本数据类型和引用数据类型的区别堆和栈中内容的区别 数组…

yolo系列中的一些评价指标说明

文章目录 一. 混淆矩阵二. 准确度(Accuracy)三. 精确度(Precision)四. 召回率(Recall)五. F1-score六. P-R曲线七. AP八. mAP九. mAP0.5十. mAP[0.5:0.95] 一. 混淆矩阵 TP (True positives):被正确地划分为正例的个数,即实际为正例且被分类器划分为正例…

ModuleNotFoundError: No module named ‘torch_sparse‘

1、卸载 先把torch-geometric、torch-sparse、torch-scatter、torch-cluster、 torch-spline-conv全部卸载了 pip uninstall torch-geometric torch-scatter torch-sparse torch-cluster torch-spline-conv 2.conda list确定PyTorch的版本,我的是1.10 3、确定下载地…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 3 Finding Similar Items

来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT It is therefore a pleasant surprise to learn of a family of techniques called locality-sensitive hashing, or LSH, that allows us to focus on pairs that are likely to be similar, without hav…

使用bard分析视频内容

11月21日的bard update 更新了分析视频的功能,使用方法如下: 1、打开bard网站。https://bard.google.com/ 2、点击插件。 3、点击YouTube中的 research a topic 选项。 4、输入需要分析的内容: Please analyze how many technologies are in…

五种多目标优化算法(MOGWO、MOLPB、MOJS、NSGA3、MOPSO)求解微电网多目标优化调度(MATLAB代码)

一、多目标优化算法简介 (1)多目标灰狼优化算法MOGWO 多目标应用:基于多目标灰狼优化算法MOGWO求解微电网多目标优化调度(MATLAB代码)-CSDN博客 (2)多目标学习者行为优化算法MOLPB 多目标学习…

win10+ vs2017用cmake编译geos3.5.1

参考教程:使用CMake编译Geos3.5.0_cmake geos-CSDN博客 注意事项: 报错:在使用cmake编译geos-3.5.1的时候,会出现报错: CMake Error at CMakeLists.txt:330 (include): include could not find load file GenerateSou…

map和set的底层结构 --- AVL树的实现(万字图文详解)

AVL树的实现 底层结构1. AVL的概念2. AVL树节点的定义3. AVL树的插入分析 4. AVL树的旋转4.1 新节点插入较高右子树的右侧---右右:左单旋4.2 新节点插入较高左子树的左侧---左左:右单旋4.3 新节点插入较高右子树的左侧---右左:先右单旋再左单…

postman和Jmeter做接口测试的区别(经验之谈)

接口测试的目的 API 测试作为集成测试的一部分,经过被测应用的接口(API)来确定是否在功能、可靠性、性能和安全方面达到预期的软件测试。因为 API 都没有 GUI 界面,API 测试都是在通信层进行的。 1.建立接口用例集 Postman功能…

redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】

redis数据结构介绍 redis是一个key-value的数据库,key一般是String类型,但是value的类型多种多样。 redis 通用命令 keys : 查看符合模板的所有key (keys partten ,匹配表达式支持一些特殊字符 * ?)del:删…

【可编程串行接口8251A】:用处、内部结构、各引脚的解释、工作方式

8251A的作用 微机内部的数据传送方式为并行方式。 若外设采用串行方式,则微机与外设之间需加串行接口。 串行接口基本功能就是:输入数据时,进行串/并转换;输出数据时,进行并/串转换。Intel8251A是一种可编程的通用同步…

【数据结构】树与二叉树(廿五):树搜索指定数据域的结点(算法FindTarget)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲3. 搜索指定数据域的结点a. 算法FindTargetb. 算法解析c. 代码实现a. 使用指向指针的指针b. 直接返回找到的节点 4. 代码整合 5.3.1 树的存储结构 5.…

基于单片机压力传感器MPX4115检测-报警系统proteus仿真+源程序

一、系统方案 1、本设计采用这51单片机作为主控器。 2、MPX4115采集压力值、DS18B20采集温度值送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 /*********************************…

js中map和forEach的区别

forEach只是遍历数组的元素;map映射遍历,除了遍历数组的元素,还会返回一个新的数组。map本身是映射的意思。 若我们平时开发中只是遍历元素的话,用forEach,千万别用map。 注意: 他们俩若遍历的数组元素是基…

暴雷!Shopee佣金再度上调,入驻还需要保证金?—站斧浏览器

近段时间以来,Shopee陆陆续续地上调了多个站点地佣金费率、交易手续费以及FSS&CCB费率等,不仅如此,Shopee还官宣了入驻需要缴纳保证金!甚至已入驻商家未交保证金或会被冻结风险!这一些列操作让不少Shopee卖家有些措…