Reactor 模型(一)基本并发编程模型

Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html)

在讲解 Reactor 线程模型之前,我们需要先对基本并发编程模型:串行工作模型、并发工作模型进行讲解。

串行工作者模型和并行工作者模型关注的是将任务划分为 2 个阶段:一是任务的接受阶段;二是任务的处理阶段。而 Reactor 线程模型关注的是上述第二个阶段:任务在处理的过程中,继续划分为多个步骤进行处理。

一、串行模型

我们以一个典型的任务处理流程,来说明为什么要将任务的接受流程与处理流程划分开来

在这个例子中,一个 Worker 线程来处理用户提交的任务,任务的处理步骤粗略的分为:接受任务和处理任务两个阶段。当 Worker 接受到一个任务之后,就立刻进行处理,也就是说任务接受和任务处理是在同一个 Worker 线程中进行的,没有进行区分。这样做存在一个很大的问题是,必须要等待某个 Task 处理完成之后,才能接受处理下一个 Task。

而通常情况下,任务的处理过程会比任务的接受流程慢得多。例如在处理任务的时候,我们可能会需要访问远程数据库,这属于一种网络 IO。通常情况下 IO 操作是比较耗时的,这直接影响了下一个任务的接受,而且通常在 IO 操作的时候,CPU 是比较空闲的,白白浪费了资源。

因此我们可以考虑将任务的接受与处理分为两个线程进行处理,一个只负责接受任务,一个只负责处理任务。

这就演化出了第一个线程模型:串行工作者模型。如下所示:

在这种情况下,接受任务的线程称之为 Accept Thread,其将接受到的任务放到一个任务队列中,因此能立即返回接受下一个任务。而 Worker 线程不断的从这个队列中取出任务进行异步执行。

目前这种情况存在一个很大的问题,在于任务处理的太慢,导致队列里积压的任务数量越来愈大,任务不能得到及时的执行。所以我们可以用多个 Worker Thread 来处理任务。这就是串行工作者模型的并发版本-并行工作者模型。

二、并行模型

在并行工作者模型中,有一个 Accpet Thread,多个 Worker Thread,因为 Worker Thread 的功能都相同,所以我们通常会将其划分到一个组中(Worker Thread Group)。

在具体实现上,并行工作者线程模型有两种设计方式,以下分别进行介绍。

2.1 基于公共任务队列

并行工作者线程模型设计方式一:基于公共任务队列

accept Thread 将接受到的任务放到任务队列中,Worker Thread group 中的多个 Worker Thread 并行的从公共的队列中拉取任务进行处理。

熟悉java线程池 的用户可能已经发现,可以用ThreadPoolExecutor 来实现右半部分的功能,因为ThreadPoolExecutor 就是多个线程从一个公共的任务队列中拉取任务进行执行。通过在main线程中接受任务,将任务提交到线程池中,即可以完成上述线程模型。

2.2 每个 Worker Thread 维护自己的任务队列

在第一种方式中,由于多个Worker线程同时从一个公共的任务队列中拉取任务进行处理,因此必须要进行加锁,因而影响了效率。因此又有了下面一种设计方式:Reactor Thread直接将任务转发给各个 Worker Thread,每个 Worker Thread 内部维护一个队列来处理,如下图

这种方式的设计,避免的锁竞争,因为每个 Worker Thread 都从各自的队列中取出任务进行执行。实际上,Netty 的实现中,就是为每个 Worker Thread 维护了一个队列。

需要注意的是:由于现在是 Accpet Thread 直接给过个 Worker Thread 转发任务,任务分配的平均的责任就落到了 Reactor Thread 的身上。


每天用心记录一点点。内容也许不重要,但习惯很重要!

Reactor 模型(一)基本并发编程模型的更多相关文章

  1. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  2. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...

  3. Scala并发编程模型AKKA

    一.并发编程模型AKKA Spark使用底层通信框架AKKA 分布式 master worker hadoop使用的是rpc 1)akka简介 写并发程序很难,AKKA解决spark这个问题. akk ...

  4. 4、Java并发性和多线程-并发编程模型

    以下内容转自http://ifeve.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%9E%8B/: 并发系统可以采用多种并发编程模型来实现. ...

  5. java 多线程——并发编程模型 学习笔记

                                                                                                 并发编程模型 ...

  6. Java网络编程和NIO详解3:IO模型与Java网络编程模型

    Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...

  7. Scala-Unit7-Scala并发编程模型AKKA

    一.Akka简介 Akka时spark的底层通信框架,Hadoop的底层通信框架时rpc. 并发的程序编写很难,但是Akka解决了spark的这个问题. Akka构建在JVM平台上,是一种高并发.分布 ...

  8. 15. Scala并发编程模型Akka

    15.1 Akka介绍 1) Akka是Java虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时,可以理解成Akka是编写并发程序的框架 2) Akka用Scala语言写成,同时提供了S ...

  9. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

随机推荐

  1. mysql5.6下载&安装

    官网下载即可: mysql-installer-community-5.6.25.0.msi 安装: 1. 2. 3.在这里我们需要从安装程序提供的可安装的产品(Products)中选择我们需要的my ...

  2. jsp 传多个值给后端

     页面上是这样 http://localhost:8080/smartcloset/getClothByCategory/1/11 直接用/分 后台是这样取的 @RequestMapping(valu ...

  3. @Slf4j注解

    参考:https://blog.csdn.net/qq_26344609/article/details/78905845 如果不想每次都写private final Logger logger = ...

  4. 可视化库-seaborn-热力图(第五天)

    1. 画一个基本的热力图, 通过热力图用来观察样本的分布情况 import matplotlib.pyplot as plt import numpy as np np.random.seed(0) ...

  5. hibernate 异常

    1.异常:org.hibernate.AnnotationException: No identifier specified for entity异常. entity类是必须要主键的,否则就会报出这 ...

  6. Linux下类似windows下_beginthread和_endthread 的多线程开发

    在 windows下头文件中包含 #include<process.h> 就可以使用_beginthread进行线程创建.个人感觉挺方便的. 在linux下类似于_beginthread ...

  7. something about facebook token

    There are two method origin token , you can use any one of them, first one may be easier. Origin fro ...

  8. 转载:MySQL和Redis 数据同步解决方案整理

    from: http://blog.csdn.net/langzi7758521/article/details/52611910 最近在做一个Redis箱格信息数据同步到数据库Mysql的功能. 自 ...

  9. Packed with amazing data about the world in 201

    Only those who have the patience to do simple things,perfectly ever acquire the skill to do difficul ...

  10. fiddler无法抓取chrome解决方法

    前端开发中,不可避免的要和服务器端进行联调,少了fiddler这个利器可不行. 由于无线开发需要配置UA,我使用chrome进行访问,但是今儿一早过来,发现fiddler无法抓取chrome的请求了. ...