最强提升!Python多核CPU同时执行多进程,python多进程和多线程介绍。

如何利用Python多核处理器来提高性能? 对于 CPU 密集型的任务,你可以考虑使用 Cython 或其他编译型扩展来编写你的代码。但是,请注意,这通常需要更的编程知识经验。然而,Python 仍然有几种方法可以利用多核处理器来提高性能,这些方法主要涉及到多进程、并发库(如。对于非常大的数据集或复杂的计算任务,你可能需要考虑使用分布式计算框架,如 Dask。Dask 允许你轻松地将计算任务分布到个进程、线程或机器上,从而利用多核处理器或集群的并行计算能力。是一个简单的 Python 库,用于轻量级管道,特别是在科学计算环境中。 阅读详情


前言

在这里插入图片描述

随着计算机硬件的不断发展,多核CPU已经成为普及的硬件设备,利用多核CPU的优势可以有效的提高程序的执行效率

而多进程模式可以实现多核CPU的并行计算。Python作为一门高级编程语言,提供了多进程、多线程等多种方式来实现并行计算。本文将对python多进程和多线程进行分别介绍


一、什么是进程和线程

进程是分配资源的最小单位线程是系统调度的最小单位

当应用程序运行时最少会开启一个进程,此时计算机会为这个进程开辟独立的内存空间,不同的进程享有不同的空间,而一个CPU在同一时刻只能够运行一个进程,其他进程处于等待状态。

一个进程内部包括一个或者多个线程,这些线程共享此进程的内存空间与资源。相当于把一个任务又细分成若干个子任务,每个线程对应一个子任务。

二、多进程和多线程

对于一个CPU来说,在同一时刻只能运行一个进程或者一个线程,而单核CPU往往是在进程或者线程间切换执行,每个进程或者线程得到一定的CPU时间,由于切换的速度很快,在我们看来是多个任务在并行执行(同一时刻多个任务在执行),但实际上是在并发执行(一段时间内多个任务在执行)。

单核CPU的并发往往涉及到进程或者线程的切换,进程的切换比线程的切换消耗更多的时间与资源。在单核CPU下,CPU密集的任务采用多进程或多线程不会提升性能,而在IO密集的任务中可以提升(IO阻塞时CPU空闲)。

多核CPU就可以做到同时执行多个进程或者多个进程,也就是并行运算。在拥有多个CPU的情况下,往往使用多进程或者多线程的模式执行多个任务。

三、python中的多进程和多线程

1、多进程

def Test(pid):
    print("当前进程{}:{}".format(pid, os.getpid()))
    for i in range(1000000000):
        pass
if \_\_name\_\_ == '\_\_main\_\_':
    #单进程
    start = time.time()
    for i in range(2):
        Test(i)
    end = time.time()
    print((end - start))

单进程输出结果如图:

def Test(pid):
    print("当前子进程{}:{}".format(pid, os.getpid()))
    for i in range(100000000):
        pass
if \_\_name\_\_ == '\_\_main\_\_':
    #多进程
    print("父进程:{}".format(os.getpid()))
    start = time.time()
    pool = Pool(processes=2)
    pid = \[i for i in range(2)\]
    pool.map(Test, pid)
    pool.close()
    pool.join()
    end = time.time()
    print((end - start))

多进程输出结果如图:

从输出结果可以看出都是执行两次for循环,多进程比单进程减少了近乎一半的时间(这里使用了两个进程),并且查看CPU情况可以看出多进程利用了多个CPU。

python中的多进程可以利用mulitiprocess模块的Pool类创建,利用Pool的map方法来运行子进程。

一般多进程的执行如下代码:

def Test(pid):
    print("当前子进程{}:{}".format(pid, os.getpid()))
    for i in range(100000000):
        pass
if \_\_name\_\_ == '\_\_main\_\_':
    #多进程
    print("父进程:{}".format(os.getpid()))
    pool = Pool(processes=2)
    pid = \[i for i in range(4)\]
    pool.map(Test, pid)
    pool.close()
    pool.join()

1、利用Pool类创建一个进程池,processes声明在进程池中最多可以运行几个子进程,不声明的情况下会自动根据CPU数量来设定,原则上进程池容量不超过CPU数量。(出于资源的考虑,不要创建过多的进程)

2、声明一个可迭代的变量,该变量的长度决定要执行多少次子进程。

3、利用map()方法执行多进程,map方法两个参数,第一个参数是多进程执行的方法名,第二个参数是第二步声明的可迭代变量,里面的每一个元素是方法所需的参数。 这里需要注意几个点:1)进程池满的时候请求会等待,以上述代码为例,声明了一个容量为2的进程池,但是可迭代变量有4个,那么在执行的时候会先创建两个子进程,此时进程池已满,等待有子进程执行完成,才继续处理请求;

2) 子进程处理完一个请求后,会利用已经创建好的子进程继续处理新的请求而不会重新创建进程。

从图3可以看出上述两个点,如果同时处理4个进程,那么只需要2秒钟,这里是分成两次处理,花费了4秒,并且两次处理使用的子进程号都相同。

3)map会将每个子进程的返回值汇总成一个列表返回。

4、在所有请求处理结束后使用close()方法关闭进程池不再接受请求。

5、使用join()方法让主进程阻塞,等待子进程退出,join()方法要放在close()方法之后,防止主进程在子进程结束之前退出。

2、多线程

python的多线程模块用threading类进行创建

import time
import threading
import os
count = 0
def change(n):
    global count
    count = count + n
    count = count - n
def run(n):
    print("当前子线程:{}".format(threading.current\_thread().name))
    for i in range(10000000):
        change(n)
if \_\_name\_\_ == '\_\_main\_\_':
    print("主线程:{}".format(threading.current\_thread().name))
    thread\_1 = threading.Thread(target=run, args=(3,))
    thread\_2 = threading.Thread(target=run, args=(10,))
    thread\_1.start()
    thread\_2.start()
    thread\_1.join()
    thread\_2.join()
    print(count)

程序执行会创建一个进程,进程会默认启动一个主线程,使用threading.Thread()创建子线程;target为要执行的函数;args传入函数需要的参数;start()启动子线程,join()阻塞主线程先运行子线程。 由于变量由多个线程共享,任何一个线程都可以对于变量进行修改,如果同时多个线程修改变量就会出现错误。

上面的程序在理论上的结果应该为0,但运行结果如图:

出现这个结果的原因就是多个线程同时对于变量修改,在赋值时出现错误,具体解释见多线程

解决这个问题就是在修改变量的时候加锁,这样就可以避免出现多个线程同时修改变量。

import time
import threading
import os
count = 0
lock = threading.Lock()
def change(n):
    global count
    count = count + n
    count = count - n
def run(n):
    print("当前子线程:{}".format(threading.current\_thread().name))
    for i in range(10000000):
        # lock.acquire()
        # try:
            change(n)
        # finally:
        #     lock.release()
if \_\_name\_\_ == '\_\_main\_\_':
    print("主线程:{}".format(threading.current\_thread().name))
    thread\_1 = threading.Thread(target=run, args=(3,))
    thread\_2 = threading.Thread(target=run, args=(10,))
    thread\_1.start()
    thread\_2.start()
    thread\_1.join()
    thread\_2.join()
    print(count)

python中的线程需要先获取GIL(Global Interpreter Lock)锁才能继续运行,每一个进程仅有一个GIL,线程在获取到GIL之后执行100字节码或者遇到IO中断时才会释放GIL,这样在CPU密集的任务中,即使有多个CPU,多线程也是不能够利用多个CPU来提高速率,甚至可能会因为竞争GIL导致速率慢于单线程。所以对于CPU密集任务往往使用多进程,IO密集任务使用多线程。


相关文章:Python中如何利用多进程模式提高程序的执行效率
在这里插入图片描述

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉CSDN大礼包:《Python入门资料&实战源码&安装工具】免费领取安全链接,放心点击

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python基础学习视频

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python工具包+项目源码合集
①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

六、Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Python - 使用处理并行处理受 CPU 限制的任务 这是一个令人讨厌的情况,在这种情况下,更旧版本的 Windows(想想 Win 3.1)可能会被冻结,因为每个进程(或应用程序)都必须放弃其执行时间片以将其交给其他程序,因此它们可以继续。软件进程会告诉操作系统创建个线程,因为它会做一些其他的事情,需要在自己的进程空间中运行,向其他进程报告,等等。是的,将计算拆分为个线程实际上比串行实现要慢,而且使用的线程越,速度就越慢。现在,作为基准测试的基础,我将使用以下串行(单线程)因子分解器,它接受要分解的数字列表,并返回一个将数字映射到其因子列表的字典:。 阅读详情

相关推荐

python 实现多核 CPU 并行计算

1. 使用原因: 通常现有的计算机都包含CPU,然而,现实中运行程序时,通常仅用到单 CPU,导致 CPU资源无法充分利用。因此,我们可以通过多核 CPU 并行计算来加快程序的运行。 2. 使用方法 2.1. 需要用到的功能函数 获取 CPU的内数量 cpu_num = multiprocessing.cpu_count() 并行计算函数 proc = multiprocessing.Process(target=single_run, args=(digits, "paralle

zengyue.nju 7644

PythonCPU)并行数据处理解决方案

Python 进行数据处理的时候,因为有GIL锁,因此多线程也只能使用一个处理器,这样经常出现程序运行只使用了一个CPU心在运算,导致数据处理需要比较长的时间。如果将CPU同时参与运算,可以大幅度运算速度,下面讨论原则上不修改程序而发挥CPU效率方案。

肖永威的专栏 1万+

Opencv最强案例——使用摄像头、OpenCVPython扫描条形码二维码。(3)

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。工具都帮大家整理好了,安装就可直接上手!当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

2401_84139697的博客 386

性能爆炸!Python多进程模式实现多核CPU并行计算

随着计算机硬件的不断发展,多核CPU已经成为普及的硬件设备,利用多核CPU的优势可以有效的提高程序的执行效率。而多进程模式可以实现多核CPU的并行计算。Python作为一门高级编程语言,提供了多进程多线程种方式来实现并行计算。在本文中,我们将重点介绍Python中如何利用多进程模式提高程序的执行效率。在Python中,使用多进程模式可以实现多核CPU的并行计算,从而提高程序的执行效率。

2301_80240808的博客 9346

生信领域地球最强CPU服务器

数信云重磅升级生信计算平台,推出顶级配置服务器:搭载768线程处理器、2.3T DDR5内存双RTX5090旗舰GPU,算力较传统配置提升5-8倍。新平台支持大规模基因组分析、蛋白质预测等复杂任务,实现任务并行处理。提供预装生信工具链R/Python环境,支持SSH、RStudioJupyterHub等种访问方式,并配备专业技术团队提供7×24小时支持。首发用户可享专属定制服务优先体验一站式分析平台。

2401_89507557的博客 1295

24招加速你的Python,超级实用!

点击上方“Python高校”,关注你的技术大学前期从以下九个方面讨论了加速Python的具体方法,一共24个,每个都带有优化前后的对比,非常实用。分析代码运行时间加速查找加速循环加速函数...

Python爬虫和机器学习专栏 426

Blender渲染性能深度优化:多线程CPU调度与GPU异构计算实战配置

Blender作为开源三维创作套件,在渲染性能方面拥有强大的并行计算架构。通过精准的多线程CPU调度与GPU异构计算优化,用户可实现**渲染速度提升300%**的性能飞跃。本文针对技术爱好者专业用户,深入解析Blender渲染引擎底层架构,提供从硬件配置到软件调优的全方位实战指南。 ## 渲染性能瓶颈诊断与架构解析 ### 心性能监控工具 Blender内置的性能分析系统位于`sourc

gitblog_00628的博客 576

Opencv最强案例——使用摄像头、OpenCVPython扫描条形码二维码。(1)

🍅 硬资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取。

2401_84139697的博客 434

python加锁的方法_python 方法锁

Python基础系列讲解——线程锁Lock的使用介绍我们知道Python的线程是封装了底层操作系统的线程,在Linux系统中是Pthread(全称为POSIX Thread),在Windows中是Windows Thread。因此Python的线程是完全受操作系统的管理的。但是在计算密集型的任务中多线程反而比单线程更慢。这是为什么呢?在CPyt...文章千锋Python讲堂2019-12-1279...

weixin_39615643的博客 2831

2025最强Jetson推理API指南:C++与Python接口实战

你还在为NVIDIA Jetson设备上的深度学习接口开发头疼?本文将系统梳理jetson-inference的C++与Python双接口,通过3个心场景、5段示例代码2类性能优化技巧,帮你2小时内实现从模型加载到实时推理的全流程。读完本文你将掌握: - 快速调用预训练模型进行图像分类/目标检测 - 理解C++底层API与Python封装的对应关系 - 优化推理性能的3个实用参数配置 ## ...

gitblog_00289的博客 494

2020年最强Python库,年度Top10出炉(下)

2020年最强Python库,年度Top10出炉(下) 6、Hydra and OmegaConf 在做机器学习项目的时候,需要做一大堆的环境配置工作。因此,在一些复杂的应用程序中,配置管理工作也相应变得复杂。 Hydra可以使配置工作变得简单。它能够从命令行或者配置文件中覆盖部分出来,无需维护相似的配置文件,用组合的方式进行配置,从而加快了实验运行速度。 Hydra兼容性强,拥有含插件的结构,能够很好地与开发者的操作文件融合。它的插件还可以实现直接通过命令行,就把代码发布到AWS或者其他云端系统。 Hy

qq_42992919的博客 369

2024年Python这几个库,快到飞起(1)

可以使用关键字cdef定义变量。

2401_84562962的博客 995

Python训练打卡Day34

GPU训练及类的call方法

m0_58811034的博客 1192

python学习DAY34打卡

self.fc1是一个实例化的对象,为什么具备了函数一样的用法,这是因为nn.Linear继承了nn.Module类,nn.Module类中定义了__call__方法。可以注意到,self.fc1 = nn.Linear(4, 10) 此时,是实例化了一个nn.Linear(4, 10)对象,并把这个对象赋值给了MLP的初始化函数中的self.fc1变量。综上,数据传输各种固定开销的总,超过了 GPU 在这点计算量上通过并行处理所能节省的时间,导致了 GPU 比 CPU 慢的现象。

m0_55265967的博客 740

CPU、GPU与CUDA:从架构原理到实战优化的异构计算指南

计算机体系结构中,CPUGPU代表了两种截然不同的计算哲学。CPU作为通用处理器,专注于低延迟强大的单线程性能,擅长处理复杂的串行任务逻辑控制。而GPU则采用众架构,通过海量简单心并行处理数据,追求高吞吐量,尤其适合大规模数据并行计算。这种异构计算模式的心价值在于,它能将不同类型的计算任务分配给最擅长的硬件单元,从而极大提升整体系统效率。为了实现CPU与GPU的高效协作,NVIDIA推出了CUDA并行计算平台。CUDA不仅是一套编程模型指令集,更是连接两者的关键桥梁,它允许开发者编写函数,

weixin_34023982的博客 341

Python编程思维进阶:从腾讯编程营练习题到实战能力提升

Python编程学习中,算法与数据结构是构建高效程序的心基础,其原理在于通过合理组织数据使用优化策略来提升计算效率。掌握这些技术对于解决复杂问题、优化系统性能具有重要价值,广泛应用于数据处理、系统开发性能优化等场景。本文以腾讯编程营练习题为例,深入剖析了哈希表、双指针等经典算法的应用,并结合虚拟环境配置、代码调试等工程实践,帮助开发者将解题思维转化为项目实战能力,实现从基础练习到工程应用的跨越。

338

Python多线程实战指南:突破GIL限制的I/O并发优化

线程是操作系统级的并发执行单元,其心价值在于高效调度I/O等待期的空闲CPU资源。在Python中,受GIL(全局解释器锁)影响,多线程无法加速纯CPU计算,但会自动释放锁以支持网络请求、文件读写、数据库交互等系统调用——这正是I/O密集型任务性能提升的关键原理。技术价值体现在轻量可控、调试友好、与同步生态无缝兼容;典型应用场景包括HTTP批量采集、实时日志处理、WebSocket连接管理及微服务间异步协同。本文聚焦threading模块的生产级用法,深入解析GIL真实作用边界、线程安全实践、Thread

weixin_34067102的博客 410
上一篇: Python爬虫基础之scrapy框架安装,工作三年程序员在线讲解~
下一篇: Python网络爬虫HTTP原理,从零开始入门爬虫!
一秋的编程笔记
博客等级 码龄3年 1572粉丝 319原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值