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. django-区分时区的时间类型

    # aware time:清醒的时间(清醒的知道自己这个时间代表的是哪个时区的)# navie time:幼稚的时间(不知道自己的时间代表的是哪个时区) 在settings.py中设置 LANGUAG ...

  2. LeaderF常用用法

    常用: 搜索当前目录下的文件 :LeaderfFile <leader>f 搜索当前的Buffer :LeaderfBuffer <leader>b 搜索最近使用过的文件( s ...

  3. web常见攻击

    DoS和DDoS攻击 DoS(Denial of Service),即拒绝服务,造成远程服务器拒绝服务的行为被称为DoS攻击.其目的是使计算机或网络无法提供正常的服务.最常见的DoS攻击有计算机网络带 ...

  4. mysql 集群 数据同步

    mysql集群配置在网站负载均衡中是必不可少的: 首先说下我个人准备的负载均衡方式: 1.通过nginx方向代理来将服务器压力分散到各个服务器上: 2.每个服务器中代码逻辑一样: 3.通过使用redi ...

  5. Screen Monitors

    Screen Screen->MonitorCount Monitors Screen->FormCount Screen->Forms[I]->Name

  6. 使用java代码执行linux命令

    前提: java代码是在windows下面写的,要打包放到linux下面运行,并且执行某个脚本. java代码: try { // 起作用的代码其实就下面这一行, 参数是linux中要执行的代码 Ru ...

  7. Egret - timer

    相关:http://edn.egret.com/cn/index.php/article/index/id/154 1.Timer 的使用方法非常简单,我们只需要关心两个属性,三个方法和两个事件即可. ...

  8. cmake编译参数

    进入源码目录后 cmake . -LH  --查看之前编译参数 ccmake .  使用cmake gui界面进行查看和编辑编译用到的参数 (推荐) 源码目录下 INSTALL-SOURCE 文件后面 ...

  9. ID3、C4.5和cart算法比较(转)

    转自:https://www.zhihu.com/question/27205203

  10. innerText 与textContent区别

    两者都是可以过滤html元素 innerText 获取内容 换行会有L类似特殊符号 textContent 没有