多线程程序和单进程程序中都有使用,在网络服务中都有使用。多线程程序主要用于同步的处理一些请求,为了在同一时间处理较多的请求。一般采取线程池的策略,一个主线程来分配请求。
(一)常见的进程模型:
(1)多线程模型
这种模式固定线程数量,吞吐量是接近每个线程的吞吐量*线程数。不具有伸缩性,伸缩性不强,在高负载下能力有很大限制。对于负载不大的情况下的同步数据访问应用还是比较广泛的。
(2)多线程模型二
这种模型是一个线程负责调度任务到不同的线程,通常维护一个线程池,线程池的线程数量可以伸缩,由调度线程决定。回报也通过调度线程来处理,线程与线程之间通过共享内存来获取其他方式来通信都可。但是其最高的线程数量也有限制。
(1)单进程模型
这种模型采用全异步的模式处理请求,进程维护一个每个请求的全局队列,工作进程与网络进程是独立的,采用共享内存的模式进行通信,在全异步的情况下,也能做到高并发量,和高吞吐量。这种模型易于控制,需要对过载进行保护。
(二)几种常见的模型对比
(1)程序复杂度
最复杂是采用具有调度功能的线程池,这种模型需要一个调度线程,调度线程要做的工作包括指派工作线程,过载保护,与多个线程通信,同步。线程之间共享资源要加锁,线程之间可以消除共享资源,提高处理能力。可以采用同步的处理的模式访问,但是风险较大。
单进程的模型比较简单,一个进程将要完成所有功能,包括收包,逻辑处理,过载保护。
(2)性能
一般来说,前端接收请求的,具有多客户端,多版本,多协议的适合采用多线程的模式,如果有统一的协议格式,则应当采用具有调度线程的线程池来完成。如果协议不同,则需要采用不同的线程监听不同的端口来解决。
后台服务一般适合采用单进程。后台线程要求高并发量,高吞吐量。单进程模型消除了锁,并且避免了多线程很多的复杂问题。多线程在开发过程中还有个很大的缺点是不利于调试。对开发者的调式技巧要求较高。
后台也有使用多线程的,后台的后台一般都使用单进程。
(3)竞争
多线程存在竞争问题,多线程会遇到很多程序陷阱,全局的数据,队列,map等数据结构的修过都需要加锁
单线程的程序显然不会存在竞争性问题,单线程在程序中编程是比较简单的。很多时序以及竞争性问题都不存在。
(4)服务健壮性
多线程中,任何一个线程出现问题,都会引起整个进程的挂掉,这与单进程没有区别。多线程的一个好处是可以调用同步的api,而单进程网络服务中一般只允许调用异步的API。