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