多进程
Python多进程编程指南
1. 进程基础
1.1 进程概念
进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的内存空间,使得多个进程可以同时运行而互不干扰。
Python提供了多种方式来实现多进程编程,包括:
os.fork()(Unix/Linux/macOS)multiprocessing模块 (跨平台)concurrent.futures模块 (Python 3.2+)subprocess模块 (运行外部命令)
2. 使用fork创建进程
Unix/Linux系统提供了fork()系统调用,它创建当前进程的一个副本(子进程)。
注意:Windows系统没有fork()调用,因此这段代码在Windows上无法运行。
3. 跨平台多进程编程
Python的multiprocessing模块提供了跨平台的多进程支持。
3.1 使用Process类
3.2 进程池(Pool)
当需要创建大量子进程时,使用进程池更高效:
最佳实践:
- 使用
with语句管理进程池资源 - 默认池大小等于CPU核心数
apply_async用于非阻塞调用,apply用于阻塞调用
4. 运行外部进程
subprocess模块可以运行外部命令并管理其输入/输出:
4.1 简单调用
4.2 复杂交互
5. 进程间通信
5.1 使用Queue
5.2 使用Pipe
6. 现代多进程编程
Python 3.2+引入了concurrent.futures模块,提供了更高级的接口:
7. 最佳实践与注意事项
-
平台兼容性:
- 在Unix-like系统上,
multiprocessing使用fork() - 在Windows上,使用
spawn启动方式
- 在Unix-like系统上,
-
if name == 'main':
- 在Windows上必须使用这个保护,避免子进程重复执行代码
-
资源共享:
- 避免共享状态,使用消息传递(Queue/Pipe)
- 如果需要共享数据,使用
multiprocessing.Value或Array
-
性能考虑:
- 进程创建开销比线程大
- 适合CPU密集型任务
- 对于IO密集型任务,考虑多线程或异步IO
-
错误处理:
- 子进程中的异常不会自动传播到父进程
- 使用
Process.exitcode检查子进程退出状态
8. 总结
Python提供了丰富的多进程编程工具,从低级的os.fork()到高级的concurrent.futures。选择哪种方式取决于:
- 平台要求(跨平台/Unix-only)
- 任务类型(CPU密集型/IO密集型)
- 代码复杂度需求
对于现代Python开发,推荐:
- 简单任务:
multiprocessing.Pool - 复杂任务:
concurrent.futures.ProcessPoolExecutor - 精细控制:
multiprocessing.Process
通过合理使用多进程,可以充分利用多核CPU的计算能力,显著提高程序性能。

