前言
并发在现在已经是十分常见的问题了,由于人类信息量的增加,很多信息都需要并发处理,原有的串行处理已经很难满足现实的需求。
今天我们来讲一讲5种常见的并发模型
1、Future模型
Future模型是将异步请求和代理模式结合的产物
举例:假设我们是一个电商平台,用户在网站下单。用户操作的是客户端它会向Future服务端发送数据,服务端会从后台的数据接口获取完整的订单数据,并响应用户。
我们模拟一下用户订单的行为:
A、用户挑完商品开始下单,这时客户端向服务器端发送请求1。
B、服务端根据客户端的信息,向后台获取完整的订单数据。这里做一个说明,比如用户客户端只发送了几个商品的id和数量,我们的服务端需要从后台数据库读取商家、商品、订单、库存等各种信息,最后拼成完整的一个订单返回。
C、步骤2会比较耗时,因此服务端直接返回给客户端一个伪造的数据,比如一个订单id。
D、客户端收到订单id后,开始检查订单信息,比如检查一下商品数量是否正确。
注意:
这里如果需要付款的话,就要等到最后订单数据的返回,也就是真实的数据返回。如果数据没有返回,就要一直等待,直到返回。
这时候完整的订单信息拼接完成了,返回了订单的完整数据,用户付款并完成这个订单。
客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段
2、Fork/Join模型
将任务分割成足够小的小任务,然后让不同的线程来做这些分割出来的小事情,然后完成之后再进行join,将小任务的结果组装成大任务的结果
3、Actor模型
每个线程都是一个Actor,这些Actor不共享任何内存,所有的数据都是通过消息传递的方式进行的
一个Actor指的是一个最基本的计算单元。它能接收一个消息并且基于其执行计算
Actors有邮箱
尽管许多actors同时运行,但是一个actor只能顺序地处理消息。也就是说其它actors发送了三条消息给一个actor,这个actor只能一次处理一条。所以如果你要并行处理3条消息,你需要把这条消息发给3个actors。
消息异步地传送到actor,所以当actor正在处理消息时,新来的消息应该存储到别的地方。Mailbox就是这些消息存储的地方
4、生产者消费者模型
核心是使用一个缓存来保存任务。开启一个/多个线程来生产任务,然后再开启一个/多个来从缓存中取出任务进行处理。
这样的好处是任务的生成和处理分隔开,生产者不需要处理任务,只负责向生成任务然后保存到缓存。而消费者只需要从缓存中取出任务进行处理。使用的时候可以根据任务的生成情况和处理情况开启不同的线程来处理。
生成的任务速度较快,那么就可以灵活的多开启几个消费者线程进行处理,这样就可以避免任务的处理响应缓慢的问题
5、Master-Worker模型
核心思想:系统有两个进程协作工作
Master进程,负责接收和分配任务;
Worker进程,负责处理子任务。
当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果
Worker:用于实际处理一个任务;
Master:任务的分配和最终结果的合成;
Main:启动程序,调度开启Master。
CSP模型 待研究