Python 多进程(multiprocessing)中,子进程会完全复制主进程的内存数据,但是进程之间的变量、数据是完全独立、互不干扰的------ 修改一个进程里的数据,绝对不会影响其他进程。
这是进程和线程最大的区别:
- 多线程:共享同一块内存,数据会互相影响,需要加锁
- 多进程:内存完全隔离,数据独立,天然安全
进程拥有独立的内存空间
每个进程都有自己独立的栈、堆、全局数据区,互不共享。
如果需要进程间通信(共享数据)
既然默认隔离,那想让进程之间传递数据 / 共享数据,就必须用专门的机制:
常用共享 / 通信方式
| 方式 | 用途 |
|---|---|
Queue 队列 |
进程间安全传递数据(最常用) |
Pipe 管道 |
两个进程间双向通信 |
Value / Array |
共享简单数值 / 数组 |
Manager |
共享列表、字典等复杂对象 |
| 共享内存 | 高性能大数据共享 |
注意:Windows 没有 fork 机制,Python 多进程只能靠「重新导入模块」创建子进程,模块顶层所有代码、全局变量、函数、类都会被完整加载复制,跟主进程一样;
只有 if __name__ == '__main__' 内部代码不会在子进程执行。 (因为子进程的name不是main)
Python多进程执行时序
- 程序启动,先从头到尾执行整个 py 文件
运行所有if __name__ == '__main__'外面的代码:全局变量定义、函数定义、顶层打印、赋值语句...... - 执行到
if __name__ == '__main__'内部
创建进程对象Process() - 调用
p.start()→ 唤醒子进程 - 子进程内部:再次先跑一遍本文件所有 main 外语句
- 跑完所有外层语句后,才开始执行你绑定的子进程函数