当前位置:
首页 > Python基础教程 >
-
python并发编程深入探讨
以下是我对Python多进程并发编程的理解,内容涵vb.net教程C#教程python教程SQL教程access 2010教程盖核心概念、使用场景、实现方式及代码示例:
一、多进程 vs 多线程
-
核心区别:
- 进程拥有独立内存空间,线程共享同一进程内存
- Python的GIL(全局解释器锁)限制多线程的CPU密集型并行
- 多进程适合CPU密集型任务,多线程适合I/O密集型任务
-
选择策略:
- CPU密集型:多进程(如数值计算、图像处理)
- I/O密集型:多线程/协程(如网络请求、文件读写)
二、multiprocessing 核心组件
1. Process 类
from multiprocessing import Process
import os
def worker(name):
print(f'子进程 {name} PID: {os.getpid()}')
if __name__ == '__main__':
p = Process(target=worker, args=('process1',))
p.start()
p.join()
print("主进程结束")
2. 进程池 Pool
from multiprocessing import Pool
def square(x):
return x * x
if __name__ == '__main__':
with Pool(4) as pool: # 创建4个进程的池
# map方法
results = pool.map(square, range(10))
# apply_async异步方法
async_result = pool.apply_async(square, (5,))
print(async_result.get()) # 获取结果
三、进程间通信(IPC)
1. Queue 队列
from multiprocessing import Process, Queue
def producer(q):
q.put('Hello from child')
def consumer(q):
print('Received:', q.get())
if __name__ == '__main__':
q = Queue()
p1 = Process(target=producer, args=(q,))
p2 = Process(target=consumer, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
2. Pipe 管道
from multiprocessing import Process, Pipe
def child(conn):
conn.send('Message from child')
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=child, args=(child_conn,))
p.start()
print(parent_conn.recv()) # 输出接收的消息
p.join()
3. 共享内存
from multiprocessing import Process, Value, Array
def modify(n, arr):
n.value = 3.1415927
for i in range(len(arr)):
arr[i] = -arr[i]
if __name__ == '__main__':
num = Value('d', 0.0) # 双精度浮点数
arr = Array('i', range(10)) # 整数数组
p = Process(target=modify, args=(num, arr))
p.start()
p.join()
print(num.value) # 3.1415927
print(arr[:]) # [0, -1, -2,...-9]
四、进程同步
1. Lock 锁
from multiprocessing import Process, Lock
def printer(lock, item):
with lock:
print(f'Process {item} acquired lock')
if __name__ == '__main__':
lock = Lock()
items = ['A', 'B', 'C']
processes = []
for item in items:
p = Process(target=printer, args=(lock, item))
processes.append(p)
p.start()
for p in processes:
p.join()
2. Event 事件
from multiprocessing import Process, Event
import time
def waiter(event):
print("等待事件触发...")
event.wait()
print("事件已触发!")
if __name__ == '__main__':
event = Event()
p = Process(target=waiter, args=(event,))
p.start()
time.sleep(2)
event.set() # 触发事件
p.join()
五、高级特性
1. Manager 管理器
from multiprocessing import Process, Manager
def worker(d, l):
d[os.getpid()] = os.getpid()
l.append(os.getpid())
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list()
processes = []
for _ in range(4):
p = Process(target=worker, args=(d, l))
processes.append(p)
p.start()
for p in processes:
p.join()
print("Dict:", d)
print("List:", l)
2. 跨平台启动方式
# Windows必须使用以下保护代码
if __name__ == '__main__':
# 主进程代码
六、性能优化建议
- 控制进程数量(通常等于CPU核心数)
- 避免频繁创建/销毁进程(使用进程池)
- 减少进程间通信次数和数据量
-
使用
fork
(Linux)或spawn
(Windows)启动方法from multiprocessing import set_start_method set_start_method('spawn') # 在程序开始处设置
七、典型应用场景
- 大规模数据并行处理
- CPU密集型科学计算
- 分布式任务处理
- 并行图像/视频处理
- 多任务隔离执行(每个进程独立运行)
通过合理使用多进程,可以显著提升Python程序的执行效率,特别是在多核CPU环境下。注意平衡任务分配和通信开销,才能达到最佳性能。
原创文章,转载请注明出处:https://www.xin3721.com/
栏目列表
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
开启SQLSERVER数据库缓存依赖优化网站性能
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比