多进程与多线程的选择_转
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
1. 各自特色
关于线程和进程,我们上大学时的教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。当然了,这句话应付考试已经够了,但是在工作中,光知道这句话是一点用都没有的。
我们在做程序设计的时候,会纠结是用多线程还是用多进程,我可以告诉你,这个问题没有标准答案,合理即正确。根据实际的项目需求,哪个合适选择哪一个。
下面对比一下多进程和多线程的区别
对比项 |
多进程 |
多线程 |
结论 |
数据共享 |
数据共享复杂,需要使用IPC,同步简单 |
数据是共享的,同步复杂 |
各有优势 |
内存、cpu |
占用内存多,切换耗费资源多 |
占用内存少,切换简单 |
线程占优 |
创建、销毁和切换 |
创建、销毁和切换耗费资源多 |
创建、销毁和切换耗费资源少 |
线程占优 |
编程、调试 |
编程简单、调试简单 |
编程复杂、调试复杂 |
进程占优 |
可靠性 |
进程间相互独立,不影响 |
一个线程挂掉导致整个进程退出 |
进程占优 |
分布式 |
适用于多核心、多机分布式;如果一台机器不够,扩展到多机比较简单 |
适用于多核心分布式 |
进程占优 |
从上表的比较结果来看,多进程和多线程是鱼和熊掌的关系。
2 如何选择
通过上面的比较,想必是选择多进程还是多线程,大家心里已经有些底了。
-
需要频繁创建、销毁的优先使用线程
这种应用以web服务器为多,新的连接创建一个线程,当处理完毕以后释放线程,如果是进程的话,消耗还是比较大的。当然了,Apache使用的就是多进程,这里不是不能用多进程,而是优先使用多线程。
-
需要进行大量计算的,优先使用线程
大量计算肯定会占用大量的CPU时间,这时候使用多线程减少切换的代价是比较合适的。
-
强相关的处理用线程,弱相关的处理用进程
强相关,可以理解为业务联系紧密的处理,那么弱相关就是业务联系不紧密的处理了。
弱相关,比如消息的收发和消息的处理,业务联系不紧密,可以使用多进程;强相关,比如消息处理中包含了消息解码和消息处理,这时候使用多线程较好。
当然了,这不是一成不变的方式,也可以根据实际情况进行调整。
-
可能会用到多机分布式,优先使用进程
-
两种方式都能满足需求,优先使用自己最熟悉的方式
当使用多进程和多线程都能够满足需求的时候,使用自己最拿手的方式。当然了,实际的开发中,多进程和多线程方式是并存的,两种方式并不是对立的。适合及合理,合理即正确。
3. 进程池或线程池
使用进程池或线程池,是为了降低程序在运行时创建或销毁进程或线程消耗的资源,这种做法在计算机配置较低的年代有着很好的效果,可以提高程序的运行效率。
但是,预先生成子进程或子线程比用时创建子进程或子线程要复杂的多,不仅要对池中的进程/线程数量进行管理,还要解决多进程/多线程抢资源的问题,而且,在目前计算机的配置下,进程池或线程池在效率上不见得比用时创建进程或线程有优势。
因此,使用进程池或线程池的技术,不仅复杂,从现阶段来看也无优势,在新的应用中,可以放心大胆的用时创建进程或线程。