深入理解Python多进程

news2024/12/23 17:43:16

目录

一、引言

二、Python多进程基础

进程与线程的区别

Python多进程模块

三、Python多进程实现原理

进程创建

进程间通信

进程同步

四、Python多进程使用方法

创建进程

进程间通信

五、实战案例

六、总结    


一、引言

在Python编程中,多进程是一种重要的并发编程技术,它允许程序同时执行多个任务,从而显著提高程序的执行效率。特别是在处理I/O密集型任务或计算密集型任务时,多进程能够充分利用多核CPU资源,实现真正的并行计算。本文将从基础概念出发,逐步深入Python多进程的实现原理、使用方法以及实战案例,帮助读者全面理解和掌握Python多进程编程。

二、Python多进程基础

进程与线程的区别

进程是系统分配资源的基本单位,它拥有独立的内存空间和系统资源;而线程是CPU调度的基本单位,多个线程共享同一进程的内存空间和系统资源。因此,进程之间通信需要通过IPC(进程间通信)机制,而线程之间通信则相对简单。

Python中的threading模块支持多线程编程,但由于全局解释器锁(GIL)的存在,Python多线程在CPU密集型任务上并不能实现真正的并行计算。而多进程则不受GIL的限制,能够实现真正的并行计算。

Python多进程模块

Python提供了multiprocessing模块来支持多进程编程。该模块提供了一个类似于threading模块的API,但它是基于进程的。multiprocessing模块支持创建进程、进程间通信、进程同步等功能。

三、Python多进程实现原理

进程创建

在Python中,可以使用multiprocessing.Process类来创建进程。每个进程都是一个独立的Python解释器实例,它们之间通过管道、队列等方式进行通信。创建进程时,需要指定一个目标函数(即子进程要执行的函数)以及传递给该函数的参数。

进程间通信

进程间通信(IPC)是多进程编程中的一个重要问题。Python提供了多种IPC机制,包括管道(Pipe)、队列(Queue)、共享内存(SharedMemory)等。其中,队列是最常用的一种IPC机制,它提供了一个先进先出的数据结构,用于在进程之间传递数据。

进程同步

进程同步是多进程编程中的另一个重要问题。由于多个进程可能同时访问共享资源(如文件、数据库等),因此需要采取一些同步措施来避免竞态条件和数据不一致等问题。Python提供了多种同步原语,包括锁(Lock)、条件变量(Condition)、信号量(Semaphore)等。

四、Python多进程使用方法

创建进程

使用multiprocessing.Process类创建进程的基本语法如下:

from multiprocessing import Process  
  
def worker(num):  
    print(f'Worker {num} is running')  
  
if __name__ == '__main__':  
    p1 = Process(target=worker, args=(1,))  
    p2 = Process(target=worker, args=(2,))  
    p1.start()  
    p2.start()  
    p1.join()  
    p2.join()

在上面的示例中,我们定义了一个名为worker的函数作为子进程的目标函数。然后,我们创建了两个Process对象p1和p2,并将worker函数作为它们的目标函数。接着,我们调用start()方法启动这两个进程,并使用join()方法等待它们执行完毕。

进程间通信

使用队列进行进程间通信的示例如下:

from multiprocessing import Process, Queue  
  
def worker(q):  
    q.put('Hello from worker')  
  
if __name__ == '__main__':  
    q = Queue()  
    p = Process(target=worker, args=(q,))  
    p.start()  
    print(q.get())  # 输出:Hello from worker  
    p.join()

在上面的示例中,我们创建了一个Queue对象q作为进程间通信的通道。然后,我们创建了一个子进程p,并将q作为参数传递给它的目标函数worker。在worker函数中,我们使用put()方法向队列中发送一条消息。在主进程中,我们使用get()方法从队列中接收并打印这条消息。

五、实战案例

下面是一个使用Python多进程进行网络爬虫的实战案例。假设我们需要从多个网站上爬取数据,并保存到本地文件中。由于每个网站的爬取过程都是独立的,因此可以使用多进程来实现并行爬取。

from multiprocessing import Pool  
import requests  
  
def fetch_data(url):  
    response = requests.get(url)  
    # 这里只是简单地将响应内容保存到文件中,实际情况下可能需要进行更复杂的处理  
    with open(f'{url.split("/")[-1]}.html', 'w') as f:  
        f.write(response.text)

if name == 'main':
        urls = [
                'http://example.com/page1',
                'http://example.com/page2',
                'http://example.com/page3',
                # ... 其他网址
        ]

        # 创建一个进程池,这里使用CPU核心数作为进程数  
        with Pool(processes=os.cpu_count()) as pool:  
                    # 使用map方法将urls列表中的每个元素作为参数传递给fetch_data函数  
                    # 并行执行这些函数  
                    pool.map(fetch_data, urls)  
 
                 print("所有网页数据已爬取并保存。")

在上面的实战案例中,我们使用了`multiprocessing.Pool`类来创建一个进程池。进程池允许我们并行地执行多个任务,而不需要手动创建和管理每个进程。我们使用`os.cpu_count()`函数来获取系统的CPU核心数,并将其作为进程池的大小。然后,我们使用`pool.map()`方法将`urls`列表中的每个URL作为参数传递给`fetch_data`函数,并并行地执行这些函数。最后,当所有函数执行完毕后,我们打印出一条消息表示所有网页数据已爬取并保存。    

六、总结    

本文深入介绍了Python多进程编程的基础概念、实现原理、使用方法以及实战案例。通过本文的学习,读者可以全面理解和掌握Python多进程编程的相关知识,并能够在实际项目中应用多进程技术来提高程序的执行效率。需要注意的是,虽然多进程技术能够带来性能上的提升,但也会带来一些额外的问题和复杂性,如进程间通信、进程同步等。因此,在使用多进程技术时,需要根据实际情况进行权衡和选择。

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

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

相关文章

C脚本实现用键盘按键控制Wincc某按钮动作

文章目录 前言一、创建Wincc画面并添加变量及按钮二、在“事件”-“键盘”下,编写“按下”和“释放”的C脚本 前言 在某些特定场景下,需要通过电脑键盘控制上位机界面上按钮按下或释放,本文给出了基于C脚本的解决方案。 一、创建Wincc画面并…

commit过大文件,导致push失败如何解决

1、查看过大文件是谁 2、使用该命令删除过大文件 git filter-branch --force --index-filter git rm -rf --cached --ignore-unmatch 文件名 --prune-empty --tag-name-filter cat -- --all 例如: git filter-branch --force --index-filter git rm -rf --cached --…

PlugLink:让数据分析与工作流无缝连接(附源码)

PlugLink:让数据分析与工作流无缝连接 引言 数据分析和自动化工作流已成为各个企业和个人提高效率的关键手段。今天,我要介绍一款名为PlugLink的工具,它不仅能帮助你轻松进行数据分析,还能将这些分析结果无缝连接到你的工作流中&…

洛谷 P4913 二叉树深度(递归)

题目描述 有一个 𝑛(𝑛≤10^6) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 𝑛),建立一棵二叉树(根节点的编号为 1),如果是叶子结点,则输入 0。…

【大模型应用开发极简入门】提示工程二:零样本学习、少样本学习与改善提示效果

文章目录 一. 逐步思考:零样本思维链1. 数学计算推理2. 注意有效的方面 二. 少样本学习1. 基于提示词示例的学习2. 单样本学习 三. 改善提示效果1.指示模型提出更多问题2.格式化输出3.重复指示4.使用负面提示5. 添加长度限制 一. 逐步思考:零样本思维链 …

AI大模型的战场:通用大模型与垂直大模型的对决

引言 随着人工智能技术的不断进步,AI大模型在各个领域的应用也日益广泛。如今,AI大模型的战场正在分化,主要分为通用大模型和垂直大模型两个方向。通用大模型由于其适用范围广泛,在落地场景中占据了较大的优势。而垂直大模型则凭…

python3的基本语法说明三

一. 简介 前面几篇文章简单学习了 python3的基本语法,文章如下: python3的基本语法说明一-CSDN博客 python3的基本语法说明二-CSDN博客 本文继续学习 python3的基本语法。 二. python3 的基本语法 1. 等待用户输入 执行下面的程序在按回车键后就会…

就业班 第四阶段(k8s) 2401--6.11 day5 CICD实践+VPN+LDAP域管理+还有一些云产品

CICD项目实践(扩展) RBAC 角色:role 用户:user 角色绑定:rolebinding 需要自己指定好名称空间,只对某个名称空间有权限 集群角色:clusterrole 集群角色绑定:clusterrolebindin…

[初阶数据结构] 包装类 | 泛型

目录 一. 包装类 1.1 什么是包装类? 1.2 包装类的意义 1.3 基本数据类型与包装类 1.4 装箱 1.5 拆箱 1.6 小总结 二. 泛型 2.1 什么是泛型? 2.2 泛型的意义 2.3 泛型的语法 2.4 泛型的编译 2.4.1 下载插件 2.4.2 分析 2.5 上界 2.6 泛型方法 2.7 小总结 三. 总结 一.…

element-ui将组件默认语言改为中文

在main.js中加入以下代码即可 // 引入 Element Plus 及其样式 import ElementPlus from element-plus import element-plus/dist/index.css// 引入中文语言包 import zhCn from element-plus/es/locale/lang/zh-cn// 使用 Element Plus 并设置语言为中文 app.use(ElementPlus,…

乐鑫ESP32系列SOC技术让设备控制更简单,HMI智能屏方案应用

随着科技的飞速发展,我们的生活方式正在被重新定义。在智能家居领域,人机交互的便捷性和直观性一直是创新的焦点,如今正逐渐成为现实。 乐鑫以其先进的SoC技术,为智能家居行业带来了新的HMI智能屏方案。这一方案不仅集成了高性能…

商用OLED柔性屏,有42、48、55、65和77寸

商用OLED柔性屏在市场上的尺寸选择相对丰富,以下是针对您提到的42、48、55、65和77寸的具体信息: 42寸OLED柔性屏 目前市场上已有42寸的OLED柔性屏产品,如LG的42英寸电视柔性屏OLED,具有可曲直的特性,支持120Hz高刷新…

LogicFlow 学习笔记——1. 初步使用 LogicFlow

什么是 LogicFlow LogicFlow 是一个开源的前端流程图编辑器和工作流引擎,旨在帮助开发者和业务人员在网页端创建、编辑和管理复杂的业务流程和工作流。它提供了一个直观的界面和强大的功能,使得设计和管理工作流变得更加高效和便捷。 官网地址&#xff…

芯品荟 | 会议系统屏驱案例分享

一、产品简介 智能会议系统是一种对声、光、电等各种设备进行集中控制的设备。其可实现对会议过程进行签到、表决、多国语言翻译、现场摄像视像跟踪功能,并对进程中处以发言管理,达到人性化高科技水平,使会议可一键掌控。 系统要做到可方便快…

profiling模型性能分析与优化入门

一、定义 profiler 作用入门pyproftorch.summary/torchinfo 模型参数量分析以及模型可视化profiling 参数分析-模型分析 二、实现 1.profiler 作用:分析模型执行时间,内存占用 CPU/GPU 端Op执行时间统计 CPU/GPU 端Op输入Tensor的维度分析 Op的内存消耗统计 2. 入…

3D开发工具HOOPS如何推动3D打印应用实现数据格式转换、模型可视化?

3D打印技术的发展已经彻底改变了制造业、医疗、建筑和设计等众多领域。这一技术的核心在于其能够将数字模型转化为实物,而这一过程需要强大的软件支持。在这一领域,HOOPS作为一种专业的图形软件开发工具,发挥着至关重要的作用。 本文将深入探…

木板甲醛释放量气候箱法检测 木制品ENF级检测

甲醛释放量气候箱法检测 甲醛释放量气候箱法检测是一种用于评估木制品中甲醛释放量的标准测试方法。这种方法通常涉及将样品放置在一个密闭的气候箱内,模拟一定的温度、湿度和通风条件,然后定期测量箱内空气中的甲醛浓度。通过这些数据,可以计…

【ARM Cache 与 MMU 系列文章 7.5 -- ARMv8/v9 MMU FEAT_XS(XS Attribute)与 FEAT_MTE2 介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 MMU FEAT_XSXS AttributeXS Attribute 兼容性和影响XS Attribute 应用场景MMU FEAT_MTE2MTE2 主要目的和用途MTE2 工作原理MTE2 特性实现MTE2 注意事项MMU FEAT_XS 在ARMv8架构中,FE…

k8s之HPA,命名空间资源限制

一、HPA 的相关知识 HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源,HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。 (…

docker-compose部署一款老牌apm监控软件-- pinpoint(需定制docker镜像)

一、背景 公司测试环境需要重新部署一套apm监控软件,选择的是我们开发都使用过的pinpoint,当然首选使用docker-compose部署。 可是,在部署的过程中,却遇到了不少问题。 无法直接使用官网提供的docker-compose.yml,需…