Python多线程与多进程编程:提升效率的利器

news/2025/3/28 4:17:22/文章来源:https://www.cnblogs.com/yoyoliwu/p/18784909

在当今这个数据爆炸的时代,高效处理任务成为了编程中的重要需求。Python作为一门广泛使用的编程语言,提供了多种并发编程的方式,其中多线程和多进程是最为常见的两种。今天,就让我们一起深入探讨Python多线程与多进程编程的奥秘,解锁提升程序性能的秘籍。

一、多线程编程

多线程是指在一个程序中同时运行多个线程,这些线程共享程序的内存空间和资源。Python的threading模块是实现多线程的核心工具,它早在Python 1.5版本时就加入到标准库中,并且随着Python版本的升级不断优化。

(一)线程的基本使用

通过threading.Thread可以创建线程,使用start()方法启动线程,join()方法则用于等待线程执行完毕。例如,以下代码创建了两个线程,分别执行简单的打印任务:

import threading
import timedef task(name):print(f"线程 {name} 开始执行")time.sleep(2)print(f"线程 {name} 结束")thread1 = threading.Thread(target=task, args=("A",))
thread2 = threading.Thread(target=task, args=("B",))thread1.start()
thread2.start()thread1.join()
thread2.join()print("所有线程执行完毕")

(二)线程池的高效管理

当面对大量任务时,手动创建和管理线程会变得低效且复杂。此时,concurrent.futures.ThreadPoolExecutor线程池就派上用场了。它能够自动管理线程的创建和回收,提高资源利用率。例如:

import concurrent.futures
import timedef task(name):print(f"线程 {name} 开始")time.sleep(2)print(f"线程 {name} 结束")with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:executor.map(task, ["A", "B", "C", "D"])

(三)线程同步与锁

在多线程环境中,多个线程可能会同时访问和修改共享资源,从而导致数据不一致的问题,即竞态条件。为了避免这种情况,可以使用threading.Lock互斥锁来保护共享资源。例如:

import threadingcounter = 0
lock = threading.Lock()def increment():global counterfor _ in range(100000):with lock:  # 使用锁防止数据竞争counter += 1threads = [threading.Thread(target=increment) for _ in range(3)]
for t in threads: t.start()
for t in threads: t.join()print("最终计数值:", counter)

二、多进程编程

多进程与多线程不同,它是在程序中同时运行多个进程,每个进程拥有独立的内存空间和资源。Python的multiprocessing模块提供了创建和管理进程的功能,它能够充分利用多核CPU的优势,特别适合CPU密集型任务。

(一)进程的基本使用

使用multiprocessing.Process可以创建进程,其用法与线程类似。例如:

import multiprocessing
import timedef task(name):print(f"进程 {name} 开始执行")time.sleep(2)print(f"进程 {name} 结束")process1 = multiprocessing.Process(target=task, args=("A",))
process2 = multiprocessing.Process(target=task, args=("B",))process1.start()
process2.start()process1.join()
process2.join()print("所有进程执行完毕")

(二)进程池的高效管理

与线程池类似,multiprocessing.Pool进程池可以自动管理进程的创建和回收,适用于大规模计算任务。例如:

import multiprocessing
import timedef task(name):print(f"进程 {name} 开始")time.sleep(2)print(f"进程 {name} 结束")with multiprocessing.Pool(processes=3) as pool:pool.map(task, ["A", "B", "C", "D"])

三、多线程与多进程的选择

在实际开发中,选择多线程还是多进程需要根据任务类型来决定。多线程适合I/O密集型任务,如网络请求、文件读写等,因为线程切换开销小,能够提高程序的响应性。然而,由于Python的全局解释器锁(GIL)的存在,多线程在CPU密集型任务上性能受限。而多进程则适合CPU密集型任务,能够充分利用多核CPU的优势,不受GIL限制。

文章来源于zlibrary图书馆中《Python编程从入门到实践》书的Python多线程与多进程编程章节内容

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

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

相关文章

发现《双影奇境》隐藏关卡!通关就获得独家情报?!

《双影奇境》真是太太太火了! 小编身边十个人里八个人都在玩!而且每个人都赞不绝口,狂夸里面的画面和关卡设计精美又好看。 最近甚至有人发现了地狱级的隐藏关卡!不仅挑战性拉满,通关奖励居然还包含了制作人亲笔签名的瑞典工作室邀请函! 今天小编就来为你解开这一神秘关卡…

远程控制中的云电脑是什么意思?1分钟学会用

很多常用我们ToDesk远程控制的朋友们或许会注意到无论是在PC端还是移动端中都出现有【云电脑】【来云电脑爽玩-新用户免费1小时】这些词句等信息。那么这究竟是代表什么意思呐?云电脑是什么又怎么用呐?为什么要增加云电脑?以下小T就为大家科普下!什么是云电脑?为什么要设云…

WPF 你真的会写 XAML 吗?浅谈 ControlTemplate 、DataTemplate 和其它 Template

本文介绍了 WPF 中关于各种 Template 的用法。WPF 你真的会写 XAML 吗?浅谈 ControlTemplate 、DataTemplate 和其它 Template本文希望从写死的代码慢慢引入 WPF 的一些机制。一、Button 难题 我们想要修改 Button 的背景色但是效果非常不理想,默认的 Button 样式是完全无法给…

从《黑神话:悟空》看项目管理的关键策略与突破点

《黑神话:悟空》的火爆,凸显了游戏项目管理的重要性。当下游戏行业竞争激烈,面临着诸多挑战。而日事清凭借支持敏捷管理、需求与任务管理、BUG管理、多项目并行处理、知识沉淀,以及项目统计与考核等一系列功能,助力游戏研发团队实现高效协作,推动敏捷开发。8月20日上午10…

边缘检测及Canny算法

对边缘的直观理解边缘有助于我们对图像进行语义理解。直观上,边缘发生在图像强度值变化剧烈的地方 如何描述变化?自然是用导数/梯度如上图,我们对图中的信号在水平方向上求导,可以得到右侧的导数图像,可以看到,它在边缘处由于信号发生剧烈变化,导数产生了极值。因此,导…

​工贸一体企业全链路管理应用实例:业务流程优化+任务智能分配+项目进度追踪

河源集品科技主营小型家电出口,自主研发实力强。发展中项目管理遇难题,试用多款工具无果。经对比,选用日事清。其功能全面,匹配公司流程、绩效等管理需求,能一键发起流程、自动流转待办,性价比高。针对订单、生产流程、多部门协作挑战,日事清给出对应方案,试用效果出色…

如何使用FPGA开发

介绍 与传统的微控制器相比,FPGA(现场可编程门阵列)是独一无二的,因为它们不执行顺序指令。相反,它们由一组可配置的逻辑块组成,这些逻辑块可以被重新编程以执行自定义的数字逻辑功能。这使得FPGA可以并行执行多个操作,使其在信号处理、数据处理和实时控制等特定任务中非常…

3月10号-3月16号笔记三合一+两篇面经

2025.3.10 学习 八股 blocked和waiting有啥区别 触发条件:线程进入BLOCKED状态通常是因为试图获取一个对象的锁(monitor lock),但该锁已经被另一个线程持有。这通常发生在尝试进入synchronized块或方法时,如果锁已被占用,则线程将被阻塞直到锁可用。线程进入WAITING状态是…

Dicom纯js的三维重建影像浏览器

主要功能介绍 实现通过浏览器浏览Dicom影像阅片。主要功能:支持标准DIcom影像的2D浏览,预设窗位,伪彩,序列间,序列内多种布局方式。 影像处理,提供影像翻图、缩放、移动、透镜、反相、旋转、截图等操作 影像测量,提供箭头、直线、十字架、角度、Cobb、心胸比、椭圆、矩形…

电子签借贷真实吗?315报道引发的行业地震!电子签到底冤不冤?

看了315的相关报道后,曝光套路贷本来是正向的,却将电子签和高利贷混为一谈。这种无意识的混淆不仅会误导大众,也不利于新兴技术的健康发展。电子签作为一种替代纸质合同签署的新兴技术,有着独特的优势和重要的意义。在过去,不同主体之间签订合同往往需要面对面进行签署,这…

C#反编译

偶遇C#逆向题,IDA拼尽全力无法战胜,只给我一团乱码。 这时可以使用dnSpy来反编译: https://github.com/dnSpy/dnSpy/releases/tag/v6.1.8 1.dnSpy使用方法: 将你要反编译的程序的整个文件夹拖到那里,似乎只有.dll那里才能看到源码, 例题:https://www.nssctf.cn/problem/3…