Python多进程核心机制与实战应用详解
本文深入解析Python多进程编程原理,涵盖进程创建、队列Queue、管道Pipe、共享内存Value/Array及Manager高级封装。重点演示进程池Pool的串行apply与并行apply_async用法,解析回调函数机制,帮助开发者高效掌握并发编程技巧。
本文详细阐述Python多进程的工作机制与具体实现方法,旨在为读者提供实用的参考案例。
进程是指程序在计算机环境中的一次动态执行过程。启动程序即意味着创建一个进程,程序本身是静态的代码集合,而进程则是动态运行的实体。操作系统将进程划分为系统进程和用户进程两类:系统进程负责维持操作系统核心功能的运行,而用户进程则由用户启动执行。在资源分配层面,进程是操作系统进行资源调度和分配的基本单位。
创建并启动新进程
import multiprocessing,time,os
def runtask():
time.sleep(2)
print("开启一个进程:%s"%os.getpid())
if __name__ == "__main__":
p = multiprocessing.Process(target=runtask,)
p.start()
使用进程队列进行数据交换
import multiprocessing def runtask(): q.put([42,"python"]) if __name__ == "__main__": q = multiprocessing.Queue() p = multiprocessing.Process(target=runtask,) p.start() print(q.get()) # 打印结果:[42,"python"]
利用管道Pipe实现进程通信
multiprocessing.Pipe()函数返回两个连接对象,分别代表管道的两端。默认配置下,该管道支持双向数据传输。
import multiprocessing
def runtask():
conn.send("abc")
conn.close()
if __name__ == "__main__":
conn,pconn = multiprocessing.Pipe()
p = multiprocessing.Process()
p.start()
print(pconn.recv()) # 打印结果:"abc"
Value与Array共享内存机制
共享内存主要通过Value和Array两种数据结构实现。这两种结构内部均集成了锁机制,从而确保多进程环境下的数据访问安全性。
import multiprocess
def runtask():
d.value = 50
for index in range(len(a)):
a[index]+=10
if __name__ == "__main__":
# 下面的字符"d"、"i"似乎是固定的,换成其他将会报错。求大神解释
d = Value("d",20)
a = Array("i",range(10))
p = multiprocessing.Process(target=runtask,)
p.start()
p.join() # 等待进程执行完毕
print(d.value,a[:]) # 打印结果: 50.0 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Manager管理器对象
除了基础的Queue、Pipe以及Value-Array结构外,Python还提供了更高级的进程通信封装——Manager。Manager支持多种数据类型,包括list、dict、Namespace、Lock、RLock、Semaphore、BoundedSemaphore、Condition、Event、Queue、Value和Array等。具体使用示例如下:
import multiprocessing
def runtask():
d["name"] = "laowang"
l.reverse()
if __name__ == "__main__":
with multiprocessing.Manager() as manager:
d = manager.dict()
l = manager.list(range(10))
p = multiprocessing.Process(target=runtask,)
p.start()
p.join() # 等待进程执行完毕
print(d,l) # 打印结果:{'name': 'laowang'} [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
进程池Pool管理
进程池(Pool)用于统一管理一组固定数量的进程。当有任务需要执行时,进程池会从空闲进程中分配资源来完成任务,直至所有任务处理完毕。
import multiprocessing
def runtask():
pass
def callBackTask(arg): # 回调函数必须要有一个形参,否则将报错
print("执行回调函数",arg)
if __name__ == "__main__":
pool = multiprocessing.Pool(5) # 设置进程池最大同时执行进程数
for index in range(20):
pool.apply_async(func=runtask,callback=callBackTask) # 并行的,有回调方法
# pool.apply(func=runtask,) # 串行的,无回调函数
pool.close() # 关闭进程池
pool.join() # #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
执行效果对比:apply方法表现为串行执行,即一个进程执行完毕后另一个才开始;而apply_async方法则允许最多5个进程同时并行执行。
如需进一步了解Python相关技术,建议参考本站专题:《Python进程与线程操作技巧总结》、《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望上述内容能对您的Python程序设计工作提供有效帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









