Python 中的 threading 模块和 multiprocessing 模块有何区别?

news2024/12/14 13:33:58

在Python编程中,threadingmultiprocessing 模块都提供了并行处理的能力,但它们实现的方式以及适用的场景是不同的。

下面将详细解释两者的区别,并给出一些日常开发中的使用建议。

Threading(线程)

threading 模块允许开发者创建和管理线程。线程是在一个进程中运行的最小单位,它共享进程的资源,包括内存空间。

因此,线程之间的通信非常简单,可以直接访问相同的变量和数据结构。

由于GIL(Global Interpreter Lock)的存在,Python中的多线程并不适合CPU密集型任务,因为GIL在同一时刻只允许一个线程执行Python字节码,从而限制了真正的并行计算。

优点:

  • 适合I/O密集型任务,如网络请求、文件读写等。
  • 线程间通信简便,开销较小。
  • 创建和销毁线程的代价较低。

缺点:

  • 不适用于CPU密集型任务,因GIL导致性能瓶颈。
  • 多线程程序可能更难调试,容易出现竞态条件等问题。

代码示例:

import threading
import time

# 定义每个线程要运行的函数
def print_numbers():
    for i in range(5):
        print(f"Number {i}")
        time.sleep(1)

def print_letters():
    for letter in 'ABCDE':
        print(f"Letter {letter}")
        time.sleep(1)

# 创建线程
t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)

# 启动线程
t1.start()
t2.start()

# 等待所有线程完成
t1.join()
t2.join()

print("All threads finished.")
Multiprocessing(多进程)

multiprocessing 模块允许开发者创建和管理进程。与线程不同,进程拥有独立的内存空间,这意味着每个进程都有自己的GIL,所以可以绕过GIL带来的并发限制,非常适合CPU密集型任务。不过,这也意味着进程间的通信比线程复杂,通常需要通过队列、管道等方式来交换数据,增加了额外的开销。

优点:

  • 绕过GIL,适合CPU密集型任务。
  • 可以利用多核CPU的优势进行并行计算。
  • 进程崩溃不会影响其他进程。

缺点:

  • 进程间通信较为复杂。
  • 创建和销毁进程的代价较高。
  • 占用更多的系统资源。

代码示例:

from multiprocessing import Process, Queue

# 定义每个进程要运行的函数
def worker(queue):
    name = "Worker"
    num = queue.get()  # 从队列获取一个项目
    print(f"{name} received: {num}")
    result = num * num
    print(f"{name} processed: {result}")

if __name__ == '__main__':
    queue = Queue()
    queue.put(42)  # 向队列添加一个项目

    p = Process(target=worker, args=(queue,))
    p.start()
    p.join()

    print("Main process finished.")

日常开发中的使用建议

  • 选择合适的工具:根据任务类型选择使用threadingmultiprocessing。对于I/O密集型任务,threading通常是更好的选择;而对于CPU密集型任务,则应考虑使用multiprocessing
  • 避免全局状态:尽量减少对全局变量的依赖,尤其是在多线程/多进程中。这有助于避免竞态条件和其他同步问题。
  • 使用锁机制:当多个线程或进程需要共享资源时,应该使用锁或其他同步机制来确保安全访问。
  • 合理规划资源:在设计多线程或多进程应用时,考虑到系统资源的限制,不要创建过多的线程或进程。
  • 异常处理:始终为你的线程和进程添加适当的异常处理逻辑,以便在遇到错误时能够优雅地退出或恢复。
  • 测试和调试:并发程序的测试和调试更加困难,务必编写单元测试,并在开发过程中保持良好的日志记录习惯。

实际开发过程中的注意事项

  • 死锁和活锁:在使用锁的时候要注意避免死锁(两个或多个线程互相等待对方释放资源),同时也要注意防止活锁(线程不断重复尝试获得资源但总是失败)。
  • 资源竞争:确保任何可变状态在被多个线程或进程访问时都是线程安全的,必要时使用锁或者其他同步原语。
  • 性能监控:在生产环境中部署并发应用程序之前,应该进行全面的性能测试,以确保其能够稳定运行,并且了解其性能特征。
  • 安全性:特别是对于multiprocessing,要确保进程之间传递的数据是安全的,不包含敏感信息,除非这些信息是必须的并且已经采取了适当的安全措施。
  • 清理工作:确保正确地关闭线程或进程,避免僵尸进程或者线程泄漏的问题。例如,在multiprocessing中使用join()方法等待子进程结束。

以上就是关于Python中threadingmultiprocessing模块的详细介绍,以及在实际开发中的一些建议和注意事项。希望这对您有所帮助。

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

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

相关文章

使用 GD32F470ZGT6,手写 I2C 的实现

我的代码:https://gitee.com/a1422749310/gd32_-official_-code I2C 具体代码位置:https://gitee.com/a1422749310/gd32_-official_-code/blob/master/Hardware/i2c/i2c.c 黑马 - I2C原理 官方 - IIC 协议介绍 个人学习过程中的理解,有错误&…

【Unity踩坑】Unity生成iOS的XCode项目时提示错误:xcrun: error: SDK “iphoneos“ cannot be located

问题描述: Unity生成iOS的Xcode项目时,出现错误:xcrun: error: SDK “iphoneos” cannot be located 解决方法: 运行Xcode, 打开设置-Locations,将Command Line Tools里下拉项再选择一下。(不管之前有没有…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

React的状态管理库-Redux

核心思想&#xff1a;单一数据源、状态是只读的、以及使用纯函数更新状态。 组成部分 Store&#xff08;存储&#xff09; 应用的唯一状态容器&#xff0c;存储整个应用的状态树,使用 createStore() 创建。 getState()&#xff1a;获取当前状态。dispatch(action)&#xff…

Unity WebGL 编译和打包说明(官方文档翻译校正)

目录 Unity WebGL 编译和打包说明WebGL 简介WebGL 浏览器兼容性 (WebGL Browser Compatibility)平台支持 (Platform Support)多线程支持限制多线程支持的因素安装 Unity Hub 并添加所需模块WebGL 开发WebGL Player 设置Resolution and PresentationResolutionWebGL TemplateSpl…

论文概览 |《IJGIS》2024.11 Vol.38 issue11

本次给大家整理的是《International Journal of Geographical Information Science》杂志2024年第38卷第11期的论文的题目和摘要&#xff0c;一共包括9篇SCI论文&#xff01; 论文1 A review of crowdsourced geographic information for land-use and land-cover mapping: cur…

Linux系统编程——进程间通信

目录 一、前言 二、进程间通信的目的 三、进程通信的方法 四、管道 通信 1、进程如何通信 2、管道概念 3、匿名管道 1&#xff09;理解 2&#xff09;匿名管道的创建 3&#xff09;匿名管道用途——控制进程 4&#xff09;匿名管道对多个进程的控制 5&#xff09;总…

Ensembl数据库下载参考基因组(常见模式植物)bioinfomatics 工具37

拟南芥参考基因组_拟南芥数据库-CSDN博客 1 Ensembl数据库网址 http://plants.ensembl.org/index.html #官网 如拟南芥等 那么问题来了&#xff0c;基因组fa文件和gff文件在哪里&#xff1f; 2 参考案例 拟南芥基因组fa在这里 注释gff文件在这里

linux-16 关于shell(十五)date,clock,hwclock,man,时间管理,命令帮助

想显示一下当前系统上的时间该怎么显示&#xff1f;有一个命令叫做date&#xff0c;来看date命令&#xff0c;如下图&#xff0c; 第一个星期几对吧&#xff1f;然后是月日小时分钟秒&#xff0c;最后一个是年对吧&#xff1f;CST指的是它的时间格式&#xff0c;我这个可以先姑…

SMMU软件指南SMMU编程之寄存器

安全之安全(security)博客目录导读 本博客介绍了SMMUv3的编程接口&#xff1a; • SMMU寄存器 • 流表&#xff08;Stream table&#xff09; • CD&#xff08;Context Descriptor&#xff09; • 事件队列&#xff08;Event queue&#xff09; • 命令队列&#xff08;…

Windows环境基于ecplise的spring boot框架新建spring start project

SpringToolSuite4 新建项目实例 前言Windows基于ecplise 工具的spring boot 架构 前言 使用Spring boot 框架向前端传输数据 Windows基于ecplise 工具的spring boot 架构 spring-tool-suite-4官网下载链接spring tool&#xff0c;下载太慢的话可以使用迅雷加速&#xff0c;右…

26. Three.js案例-自定义多面体

26. Three.js案例-自定义多面体 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它支持 WebGL 渲染&#xff0c;并提供了多种配置选项。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

OSCP - Proving Grounds - DC-4

主要知识点 密码爆破潜在的包含密码的文件搜索在/etc/passwd 插入新用户提权 具体步骤 首先执行nmap 扫描&#xff0c;比较直接&#xff0c;80和22端口&#xff0c;22端口虽然有vulnerability,但是对咱们目前的情况来讲没有太大的帮助&#xff0c;主要关注一下80端口 Start…

【ubuntu24.04】PDFMathTranslate 本地PDF翻译GPU部署

https://huggingface.co/spaces/reycn/PDFMathTranslate-Docker排不上号官方都是要安装包,感觉可以本地试着源码部署一下, http://localhost:7860/官方是这个端口,但是我本地启动是:5000IDEA 里本地 backend启动效果 GUI 是监听7860的

汽车零部件设计之——发动机曲轴预应力模态分析仿真APP

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天&#xff0c;汽车零部件需…

基于Llamaindex的网页内容爬取实战

目的 本文不关注如何解析网页 html 元素和各种 python 爬虫技术&#xff0c;仅作为一种网页数据的预处理手段进行研究。Llamaindex 也并不是爬虫技术的集大成者&#xff0c;使用它是为了后续的存查一体化。 安装依赖 pip install llama-index-readers-web # pip install llam…

CityEngine实践——常用cga文件解析系列(2)

上回书说到了&#xff1a; 3、RULES/COMPONENTS/MASSING/SUBURBAN_BLOCK DETACHED_HOUSES.CGA ROWHOUSES.CGA SEMI_DETACHED_HOUSES.CGA 4、RULES/COMPONENTS/MASSING/URBAN_BLOCK MONOBLOCK.CGA PERIMETER_8_SHAPE.CGA PERIMETER_MULTIPART.CGA 这个cga挺有意思&#xff0c…

[64]最小路径和⭐

[64]最小路径和⭐ 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 **说明&#xff1a;**每次只能向下或者向右移动一步。 示例输入 示例 1&#xff1a; 输入&#xff1a;grid …

MATLAB中circshift函数的原理分析——psf2otf函数的核心

之所以讲到MATLAB中circshift函数&#xff0c;也是源于Rafael Gonzalez的这个图&#xff0c;作为前几篇答廖老师问的blog的基础。 Rafael Gonzalez的这个图无论从哪幅图到哪幅图都不是直接的傅里叶变换或傅里叶逆变换&#xff0c;需要循环移位&#xff0c;即circshift函数。 这…

LightningChart JS助力德国医疗设备商打造高精度肺功能诊断软件

项目背景&#xff1a; GANSHORN Medizin Electronic GmbH公司在德国开发、生产和销售肺功能诊断设备已有 40 多年历史&#xff0c;该公司专注于肺功能的可视化&#xff0c;其创新医疗技术通过开发先进的肺量测定测试、肺扩散分析和人体肺量测定测试解决方案取得了突破。GANSHO…