【Python多进程】的进阶讲解

Python多进程

  • 1. 介绍
  • 2. `multiprocessing`模块的基本用法
  • 3. 使用`Pool`
  • 4. 进程间通信
  • 5. 进程同步
  • 6. Process子类化
  • 7. 注意事项及选择

1. 介绍

Python中的多进程是通过multiprocessing模块来实现的,与多线程相比,多进程可以实现真正的并行计算,因为每个进程拥有自己的Python解释器和内存空间,因此不会受全局解释器锁(Global Interpreter Lock, GIL)的限制。

2. multiprocessing模块的基本用法

基本上,multiprocessing模块的Process类与threading模块的Thread类的使用非常相似。下面是一个简单的例子,说明如何创建和启动一个进程:

from multiprocessing import Process
import os# 子进程要执行的代码
def run_proc(name):print(f'Run child process {name} ({os.getpid()})...')if __name__=='__main__':print(f'Parent process {os.getpid()}.')p = Process(target=run_proc, args=('test',))print('Child process will start.')p.start()p.join()print('Child process end.')

当我们运行上面的代码,将会创建一个子进程,执行run_proc函数中的代码。

3. 使用Pool

如果你要启动大量的子进程,可以用进程池的方式批量创建子进程:

from multiprocessing import Pool
import timedef run_task(name):print(f"Task {name} (pid = {os.getpid()}) is running...")time.sleep(1)print(f"Task {name} is end.")if __name__ == '__main__':print("Parent process is run.")with Pool(5) as p:  # 创建拥有5个进程的进程池p.map(run_task, range(5))print("All subprocesses done.")

这里使用了Pool对象的map方法将不同的参数传入到目标函数(此例中为run_task)并并行执行函数。

4. 进程间通信

multiprocessing支持进程间的两种主要通信方式:队列(Queue)和管道(Pipe)。

from multiprocessing import Queue# 创建Queue的实例,然后使用Queue来进行进程间的通信
q = Queue()
q.put('Message 1')
q.put('Message 2')
print(q.get())

5. 进程同步

在多进程环境下,由于进程间共享资源可能会导致数据混乱,因此需要对这些资源进行同步访问控制。multiprocessing模块中的Lock类就是用来解决这一问题的:

from multiprocessing import Process, Lockdef lock_func(lock, num):lock.acquire()try:print(f'Hello from process {num}')finally:lock.release()if __name__=="__main__":lock = Lock()for num in range(5):Process(target=lock_func, args=(lock, num)).start()

6. Process子类化

threading.Thread类似,你也可以通过继承multiprocessing.Process来创建自己的进程类:

from multiprocessing import Processclass MyProcess(Process):def __init__(self, arg):super(MyProcess, self).__init__()self.arg = argdef run(self):print(f'Process with argument: {self.arg}')if __name__=='__main__':p = MyProcess('test')p.start()p.join()

MyProcess实例的start()方法被调用时,其run()方法将在独立的子进程中执行。

7. 注意事项及选择

在使用多进程时需要考虑一些事情:

  • 因为进程之间的内存是隔离的,所以它们必须通过进程间通信来交换信息,这可能会导致程序复杂。
  • 创建进程比创建线程的开销大,所以需要更多的系统资源。
  • 在多核/多处理器环境下,多进程是真正实现并行计算的一种方式。

选择使用多线程还是多进程通常取决于任务特性和需求:

  • 涉及阻塞I/O操作或需等待外部事件(如网络通信、文件I/O)的任务,使用多线程比较适合。
  • 如果任务是计算密集型的(如数学计算、数据处理),并且需要进行并行处理,那么多进程更为合适。

总之,Python的多进程编程提供了对并行任务处理的强大支持,特别是在避免GIL限制的情况下有效利用多核处理器。然而,正确地使用它需要对进程间通信、数据共享和同步有透彻的理解。

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

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

相关文章

代码随想录算法训练营第day26|39. 组合总和、 40.组合总和II、 131.分割回文串

39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 ta…

python--常用简单功能

os函数获取上层目录 # 获取当前目录 print(os.path.abspath(os.path.dirname(__file__))) # 获取上级目录 print(os.path.abspath(os.path.dirname(os.path.dirname(__file__)))) print(os.path.abspath(os.path.dirname(os.getcwd()))) print(os.path.abspath(os.path.join(o…

execl数据多维度建模(二)

源数据 1.选择数据 1)插入透视表 选中源数据的数据区域--插入--数据透视表(新的工作表名:透视表) 2)透视表设置 ShipCountry拉入行标签;CategoryName拉入列标签;sales拉入值的位置 3&#xf…

第八节:Vben Admin登录页面自定义

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 第六节:Vben Admin权限-后端控制方式 第七节…

计算机二级Python题目12

目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle画图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 sinput("请输入一个小数:") ss[::-1] cs0 for c in s:if c.:breakcseval(c) print({:*>10}.format(cs)) 1.2 基础…

软考论文写作注意事项

本博客地址:https://security.blog.csdn.net/article/details/136816368 一. 论文要求 1、形式方面的要求。首先,内容要丰满,即字数要够,其中摘要字数为 290~320,正文字数为 2200~2800&#x…

kvm利用脚本创建一个新的虚拟机 —— 筑梦之路

1. 脚本文件 #!/usr/bin/env bash # 创建虚拟机 ## 2021/3/28kvm_install(){set -ueset -o pipefail# 创建相关目录ls /home/kvm/{ks,virtualhost,virtual-img} 1>/dev/null 2>&1 || mkdir -p /home/kvm/{virtualhost,virtual-img}# 此程序的变量KVM_HOME/home/kvmK…

winpcap设备名

接口定义&#xff1a; #include <pcap/pcap.h> char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf);其中的device构造如下&#xff1a; 调用GetAdaptersInfo&#xff0c;返回值中的Adapt…

Linux 系统日志

系统日志类型 /var/log/syslog&#xff1a;系统日志&#xff0c;记录所有系统事件。/var/log/messages&#xff1a;系统消息&#xff0c;记录所有系统消息&#xff0c;包括启动信息、错误和警告信息。/var/log/auth.log&#xff1a;认证日志&#xff0c;记录所有认证事件&…

CPU生产的生命周期 - 原材料篇

CPU是中央处理器的缩写&#xff0c;它是执行程序指令的电子电路。CPU使用的基本原材料是硅、铜、铝和各种塑料。由于CPU在现代社会中被大量消耗&#xff0c;因此生产商必须考虑原材料的能源投入和环境影响。 硅是地壳中第二丰富的元素。它以二氧化硅和硅酸盐的形式存在。二氧化…

Linux——进程通信(二) 匿名管道的应用:进程池

前言 之前我们学习了进程通过匿名管道进行通信&#xff0c;实现了两个进程的数据传输。 如果我们管理的是很多个进程&#xff0c;通过管道发送指令&#xff0c;因为如果管道中没有数据&#xff0c;读端必须等待&#xff0c;也就是被管理的进程们都在等待我发送的指令&#xf…

CVE-2024-24112 XMall后台管理系统 SQL 注入漏洞分析

------作者本科毕业设计项目 基于 Spring Boot Vue 开发而成...... [Affected Component] /item/list /item/listSearch /sys/log /order/list /member/list (need time-based blind injection) /member/list/remove 项目下载地址 Exrick/xmall: 基于SOA架构的分布式…

cesium viewer camera flyto

一、viewer的flyTo内部调用的是camera的相关定位方法&#xff0c;针对不同的定位对象&#xff0c;计算出合适的位置和相机视角。viewer可以定位到entity、dataSource、Cesium3DTileset、ImageLayer等。 var rect [116.490401, 39.964771, 116.499623, 39.977102];var heading …

2024全国水科技大会:【协办单位】山东文远环保科技股份有限公司

山东文远环保科技股份有限公司坐落于千年古城齐国故都--临淄。初始成立于2011年&#xff0c;是淄博市首批国有资本参股的混合改制企业。 公司着力打造环保设备制造、环保工程及服务、环保水务/固废处理/新能源项目投资及运营管理、固废循环经济产业园等四大板块。是一家集投资、…

在https网站中加载http资源

https中加载http资源&#xff0c;如果该资源https也有&#xff0c;直接替换就是&#xff0c;如果没有&#xff0c;如果按照网上的做法大概率是不奏效。言归正传&#xff0c;在一位C友文章中看到了利用nginx来做代理来实现访问http资源之后&#xff0c;我自己也做了尝试。 参考…

Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改

前言 并发控制&#xff0c;一般有两种方案&#xff0c;悲观锁和乐观锁&#xff0c;其中悲观锁是默认每次更新操作肯定会冲突&#xff0c;所以每次操作都要先获取锁&#xff0c;操作完毕再释放锁&#xff0c;适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridCol)

栅格子组件&#xff0c;必须作为栅格容器组件(GridRow)的子组件使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 接口 GridCol(option?:{span?: number | …

综合知识篇00-综合知识考点汇总目录(2024年软考高级系统架构设计师冲刺知识点总结-综合知识篇-先导篇)

专栏系列文章推荐&#xff1a; 2024高级系统架构设计师备考资料&#xff08;高频考点&真题&经验&#xff09;https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】&#xff08;2024年软考高级…

差分数组实战——滴滴春招笔试第一题

前言 作者&#xff1a;晓宜 &#x1f308;&#x1f308;&#x1f308; 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 &#x1f319;&#x1f319;&#x1f319; 上周末参与了滴滴的春招笔试&…

二叉树的初步学习和顺序结构实现

当我们学完顺序表、链表、栈和队列的时候&#xff0c;我们就要开始学习树了。树对于以后的学习有非常大的帮助&#xff0c;尤其是排序。好了&#xff0c;开始我们的学习吧。 1.树的概念及结构 1.1树的结构 树结构是一种非线性结构。它是由n&#xff08;n>0&#xff09;个…