01-多进程的三种创建方式
下面是python多进程官网文档的翻译
我们先说 fork 启动方式。
原文的意思可能比较难以理解,我翻译一下。fork方式启动一个子进程,子进程里面的所有资源都是从主进程拷贝了一份,然后子进程执行具体的函数的时候,就会直接使用原主进程有的资源,比如说一些变量。
【1】子进程可以使用在子进程启动之前已经加载进内存的变量
【2】子进程无法使用子进程启动之后加载的变量
【3】子进程的父进程ID和主进程的ID一样
【4】子进程和父进程的模块名一样,都是__main__
, 因为这个是子进程继承自父进程的变量数据
【5】父进程的父进程ID是 python解释器的进程ID
一般说来,fork 启动方式是最快的,因为他所需的所有数据都是内存拷贝,但是很明显,某些情况下,他是最消耗内存的,比如有个项目已经运行了很久了,有很多对象,但是他们不是 子进程计算中的必须对象,会造成一定的内存占用。另外就是 fork 模式下是不安全的,比如子进程会用到某个父进程中定义的变量或者对象,后来在真正使用的时候可能已经被修改了。
再说 spawn, 他的解释很容易搞懂,我们写个代码看一下。
【1】子进程的父进程ID就是主进程的ID
【2】子进程的模块名和主进程的模块名不一样
【3】子进程无法使用父进程的变量
这个启动方式最大的缺点就是慢,他要用到的一些包,在进程启动之时都要再加载一遍,这是IO操作,非常耗时。
最后说一下 forkserver 模式
forkserver 模式是 fork 模式和 spawn 模式的结合体,主进程会先新启一个服务器进程,这个服务器进程再去以 fork 的方式启动一个新的进程,主进程负责与服务器进程打交道,服务器进程完成进程管理。
【1】主进程并不是子进程的父进程
【2】两个子进程的父进程是同一个
【3】子进程并不能使用主进程的变量
【4】子进程的模块名已经发生了变化
所以 forkserver 启动方式是一种中和的。假如说该方式只启动了一个进程,那他和 spawn 是没有区别的,他也需要重新加载包,但是后续进程多了之后,他每次都直接从 进程服务器中拷贝就完事了,速度就跟上来了。主进程启动进程服务器的时候不能传递主进程的变量,也就保证了进程安全。
下面对三种的优劣做个比较,在使用过程中如何选择,都是个人的一些浅见
【1】如果多进程需要处理的任务比较简单,使用 fork 模式最好,因为代码简单,进程启动也快,其余两种模式都需要在执行代码里特意导包等
【2】如果多进程需要执行的代码耗时比较久,需要开启的进程比较多,使用 forkserver 模式最佳,省内存
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库