Python学习计划——9.2多进程编程

devtools/2024/9/25 17:18:30/

多进程编程是一种并发编程的方式,通过使用多个进程来提高程序的并发性能。与多线程相比,多进程编程在处理CPU密集型任务时更有效,因为每个进程都有独立的内存空间和全局解释器锁(GIL)。

1. 什么是多进程

多进程是一种并发编程模型,通过创建多个独立的进程来执行任务。每个进程都有自己的内存空间,相互之间不共享数据,因此多进程编程在处理并行计算和避免GIL限制方面具有优势。

2. 创建进程

在Python中,可以使用multiprocessing模块来创建和管理进程。创建进程的基本步骤如下:

  1. 创建一个multiprocessing.Process对象,并指定目标函数。
  2. 调用start方法启动进程。
  3. 调用join方法等待进程结束。
示例
python">import multiprocessing
import timedef worker(name):print(f"进程 {name} 开始")time.sleep(2)print(f"进程 {name} 结束")# 创建并启动进程
process1 = multiprocessing.Process(target=worker, args=("Process-1",))
process2 = multiprocessing.Process(target=worker, args=("Process-2",))process1.start()
process2.start()process1.join()
process2.join()print("主进程结束")
3. 使用进程池

使用multiprocessing.Pool可以方便地管理多个进程。它提供了一个高级接口,用于创建和管理进程池。

示例
python">from multiprocessing import Pool
import timedef task(name):print(f"任务 {name} 开始")time.sleep(2)print(f"任务 {name} 结束")# 创建进程池
with Pool(3) as pool:pool.apply_async(task, ("Task-1",))pool.apply_async(task, ("Task-2",))pool.apply_async(task, ("Task-3",))pool.close()pool.join()print("主进程结束")
4. 进程间通信

进程间可以通过队列(Queue)和管道(Pipe)进行通信。multiprocessing.Queuemultiprocessing.Pipe是线程安全的,可以用于在进程之间传递数据。

示例:使用队列进行进程间通信
python">import multiprocessing
import timedef producer(q):for i in range(5):print(f"生产者生产数据: {i}")q.put(i)time.sleep(1)def consumer(q):while True:item = q.get()if item is None:breakprint(f"消费者消费数据: {item}")time.sleep(2)# 创建队列
q = multiprocessing.Queue()# 创建并启动进程
producer_process = multiprocessing.Process(target=producer, args=(q,))
consumer_process = multiprocessing.Process(target=consumer, args=(q,))producer_process.start()
consumer_process.start()producer_process.join()# 向队列发送结束信号
q.put(None)
consumer_process.join()print("主进程结束")
5. 进程同步

进程间同步可以使用multiprocessing.Lockmultiprocessing.Semaphore等同步原语来实现,确保多个进程对共享资源的安全访问。

示例
python">import multiprocessing# 共享资源
counter = multiprocessing.Value('i', 0)
lock = multiprocessing.Lock()def increment_counter(lock, counter):for _ in range(100000):with lock:counter.value += 1# 创建并启动进程
process1 = multiprocessing.Process(target=increment_counter, args=(lock, counter))
process2 = multiprocessing.Process(target=increment_counter, args=(lock, counter))process1.start()
process2.start()process1.join()
process2.join()print(f"最终计数值: {counter.value}")
6. 可运行的Python案例

下面是一个完整的Python程序,演示了多进程编程的基本操作,包括创建进程、使用进程池、进程间通信和进程同步。

python">import multiprocessing
import time
from multiprocessing import Pool# 示例1:创建进程
def worker(name):print(f"进程 {name} 开始")time.sleep(2)print(f"进程 {name} 结束")process1 = multiprocessing.Process(target=worker, args=("Process-1",))
process2 = multiprocessing.Process(target=worker, args=("Process-2",))process1.start()
process2.start()process1.join()
process2.join()print("主进程结束")# 示例2:使用进程池
def task(name):print(f"任务 {name} 开始")time.sleep(2)print(f"任务 {name} 结束")with Pool(3) as pool:pool.apply_async(task, ("Task-1",))pool.apply_async(task, ("Task-2",))pool.apply_async(task, ("Task-3",))pool.close()pool.join()print("主进程结束")# 示例3:进程间通信
def producer(q):for i in range(5):print(f"生产者生产数据: {i}")q.put(i)time.sleep(1)def consumer(q):while True:item = q.get()if item is None:breakprint(f"消费者消费数据: {item}")time.sleep(2)q = multiprocessing.Queue()producer_process = multiprocessing.Process(target=producer, args=(q,))
consumer_process = multiprocessing.Process(target=consumer, args=(q,))producer_process.start()
consumer_process.start()producer_process.join()q.put(None)
consumer_process.join()print("主进程结束")# 示例4:进程同步
counter = multiprocessing.Value('i', 0)
lock = multiprocessing.Lock()def increment_counter(lock, counter):for _ in range(100000):with lock:counter.value += 1process1 = multiprocessing.Process(target=increment_counter, args=(lock, counter))
process2 = multiprocessing.Process(target=increment_counter, args=(lock, counter))process1.start()
process2.start()process1.join()
process2.join()print(f"最终计数值: {counter.value}")


http://www.ppmy.cn/devtools/86246.html

相关文章

flume知识点

1. 简述什么是Flume ? flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用。Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 cloudera。 但随着 FLume 功能的扩展&#…

程序员纯粹八股文的危害有哪些,应该如何来解决?

“八股文”这个词在程序员面试的上下文中通常指的是那些被广泛讨论、反复练习的问题和答案,它们往往围绕着一些经典的技术知识点,例如算法、数据结构、设计模式等。这些知识在面试中被频繁提及,以至于应聘者经常会提前准备并背诵这些答案&…

html+css 实现4角移动悬停按钮

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…

【C++】set的使用

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🌈关于set🔥容量函数emptysize 🔥Modifiersinserteraseclear 🔥Operationsfindcountlower_bound和upper_…

搜维尔科技:Haption Virtuose 6D遥操作控制人形机器人操作

Haption Virtuose 6D遥操作控制人形机器人操作 搜维尔科技:Haption Virtuose 6D遥操作控制人形机器人操作

2024.7.30问题合集

2024.7.30问题合集 1.adb调试出现5037端口被占用的情况2.更改ip地址时出现以下问题3.RV1126 ip配置问题 1.adb调试出现5037端口被占用的情况 问题:5037端口被占用的情况 解决方案:将adb文件下的adb.exe和AdbWinApi.dll两个文件复制到C:\Windows\SysWOW6…

MySQL --- 数据类型

一、类型分类 数值类型bit(M)位类型,M指定位数,默认值1,范围1 - 64bool使用0和1表示真假tinyint [unsigned]带符号范围 -128~127,无符号范围 0~255,默认有符号smallint [unsigned]带符号范围 -2^15~2^15-1&#xff0c…

互联网医院系统源码与医保购药APP开发的完整技术指南

本篇文章,笔者将详细介绍互联网医院系统与医保购药APP的开发全过程,帮助开发者理解其技术要点和实现路径。 一、互联网医院系统开发 1.需求分析与系统设计 需要明确系统的功能需求,如在线问诊、预约挂号、电子病历管理、远程医疗、支付系统…