Python 教程

16.3 多进程编程:multiprocessing 模块

Python 多进程编程教程:如何使用 multiprocessing 模块 | 入门指南

Python 教程

本教程详细介绍了 Python 中的 multiprocessing 模块,包括如何创建和管理多进程、使用进程池、进程间通信等,适合初学者学习并行编程。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Python 多进程编程:multiprocessing 模块入门教程

简介

Python 的 multiprocessing 模块允许你利用多核 CPU 来并行执行任务,提高程序效率。尤其适用于计算密集型的操作,因为它可以绕过 GIL(全局解释器锁)的限制。

为什么使用多进程?

在 Python 中,由于 GIL 的存在,多线程在 CPU 密集型任务中可能不会提高性能。多进程则通过创建独立的 Python 进程来并行处理任务,每个进程有自己的内存空间和 GIL,从而真正实现并行计算。

安装和导入

multiprocessing 模块是 Python 的标准库的一部分,无需额外安装。直接导入即可:

import multiprocessing

基本用法

1. 创建和启动进程

使用 multiprocessing.Process 类来创建进程。以下是一个简单示例:

import multiprocessing
import time

def worker(name):
    print(f"进程 {name} 开始运行")
    time.sleep(2)  # 模拟耗时操作
    print(f"进程 {name} 结束运行")

if __name__ == "__main__":
    process1 = multiprocessing.Process(target=worker, args=("A",))
    process2 = multiprocessing.Process(target=worker, args=("B",))
    
    process1.start()
    process2.start()
    
    process1.join()
    process2.join()
    
    print("所有进程完成")
  • Process(target=function, args=arguments) 创建进程。
  • start() 启动进程。
  • join() 等待进程结束。

2. 使用进程池

对于大量任务,可以使用 Pool 类来管理进程池:

from multiprocessing import Pool

def square(number):
    return number * number

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    with Pool(processes=2) as pool:  # 创建有 2 个进程的池
        results = pool.map(square, numbers)
    print(results)  # 输出: [1, 4, 9, 16, 25]

pool.map() 将函数应用到列表的每个元素上,并返回结果列表。

进程间通信

多进程间通信可以使用队列或管道。以下示例展示如何使用队列:

import multiprocessing

def producer(queue):
    queue.put("Hello from producer")

def consumer(queue):
    message = queue.get()
    print(f"Consumer received: {message}")

if __name__ == "__main__":
    queue = multiprocessing.Queue()
    p1 = multiprocessing.Process(target=producer, args=(queue,))
    p2 = multiprocessing.Process(target=consumer, args=(queue,))
    
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()

同步和共享内存

可以使用 Lock 或共享内存来处理并发问题,但初学者应谨慎使用以避免竞态条件。例如,使用锁来同步访问共享资源:

import multiprocessing

def add_one(lock, shared_value):
    with lock:
        shared_value.value += 1

if __name__ == "__main__":
    lock = multiprocessing.Lock()
    shared_value = multiprocessing.Value('i', 0)
    
    processes = [multiprocessing.Process(target=add_one, args=(lock, shared_value)) for _ in range(5)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    
    print(f"最终值: {shared_value.value}")

最佳实践

  • 避免共享状态:尽量使用队列或管道进行通信,减少数据共享,以降低复杂性。
  • 处理异常:在子进程中捕获异常并适当处理,避免主进程崩溃。
  • 使用 if __name__ == "__main__"::在脚本中使用此条件,以防止在 Windows 或某些系统上出现问题。
  • 资源管理:及时清理进程和队列,避免内存泄漏。

总结

多进程编程是 Python 中处理并行任务的有效方式。通过 multiprocessing 模块,你可以轻松创建和管理进程,提高应用程序的性能。希望本教程能帮助你入门,并应用到实际项目中!

进一步学习

  • 探索 multiprocessing 模块的其他功能,如进程间的共享内存、管理器等。
  • 实践更多示例,巩固对多进程编程的理解。
开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包