Python多进程核心机制与实战应用详解

何川
何川
发布时间:2026-10-13 | 5人浏览过
原创

本文深入解析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程序设计工作提供有效帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表