Python multiprocessing 教程:并行编程实战指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Python的multiprocessing模块为创建并行程序提供了强大的工具集,能够高效利用多核处理器。与受全局解释器锁(GIL)限制的标准多线程不同,multiprocessing允许同时运行多个进程,每个进程拥有独立的内存空间和执行环境。

multiprocessing核心工作原理

Python中的多进程机制基于创建独立的进程,这些进程可以在CPU的不同核心上并行执行。每个进程运行在隔离的内存空间中,从而避免了多线程中常见的共享数据问题。

multiprocessing模块的关键组件包括:

  • Process — 用于创建和管理独立进程的类
  • Pool — 进程池,用于高效执行大量任务
  • Queue — 队列,实现进程间安全的数据传输
  • Lock — 同步机制,控制对共享资源的访问
  • Manager — 管理器,用于管理进程间的共享数据

何时使用multiprocessing

multiprocessing在以下场景中最为高效:

CPU密集型任务:数学计算、图像处理、数据分析、科学计算等。这类任务能从多核并行执行中获益。

大数据处理:当需要对大量数据元素应用相同函数时,multiprocessing能显著加速执行。

独立任务:不需要频繁在进程间交换数据的操作。

对于I/O密集型任务(文件操作、网络请求),建议使用异步编程(asyncio)或多线程。

进程的创建与管理

使用Process类的基础示例

import multiprocessing
import time

def worker_task(name, duration):
    """在独立进程中执行的函数"""
    print(f"进程 {name} 开始工作")
    time.sleep(duration)
    print(f"进程 {name} 工作完成")

if __name__ == "__main__":
    # 创建进程
    process1 = multiprocessing.Process(target=worker_task, args=("Worker-1", 3))
    process2 = multiprocessing.Process(target=worker_task, args=("Worker-2", 2))
    
    # 启动进程
    start_time = time.time()
    process1.start()
    process2.start()
    
    # 等待进程结束
    process1.join()
    process2.join()
    
    end_time = time.time()
    print(f"总执行时间: {end_time - start_time:.2f} 秒")

继承Process类

import multiprocessing
import os

class CustomProcess(multiprocessing.Process):
    def __init__(self, name, work_count):
        super().__init__()
        self.name = name
        self.work_count = work_count
    
    def run(self):
        """进程执行的方法"""
        print(f"进程 {self.name} (PID: {os.getpid()}) 开始工作")
        
        for i in range(self.work_count):
            print(f"{self.name}: 执行任务 {i+1}")
            time.sleep(1)
        
        print(f"进程 {self.name} 工作完成")

if __name__ == "__main__":
    processes = []
    
    # 创建多个进程
    for i in range(3):
        p = CustomProcess(f"Process-{i+1}", 3)
        processes.append(p)
        p.start()
    
    # 等待所有进程结束
    for p in processes:
        p.join()

使用进程池

Pool提供了便捷的接口来管理

博客

书籍推荐