事件驱动和消息驱动

2023-05-16

之前简单写过一些关于事件驱动的文章:【C/C++服务器开发】事件驱动、事件驱动架构、事件驱动编程及设计模式。

最近看到一篇不错的文章,在此转载一下:事件驱动和消息驱动

事件驱动和消息驱动
消息驱动和事件驱动很类似,都是先有一个事件,然后产生一个相应的消息,再把消息放入消息队列,由需要的项目获取。他们的区别是消息是谁产生的

消息驱动:鼠标管自己点击不需要和系统有过多的交互,消息由系统(第三方)循环检测,来捕获并放入消息队列。消息对于点击事件来说是被动产生的,高内聚。

事件驱动:鼠标点击产生点击事件后要向系统发送消息 “我点击了” 的消息,消息是主动产生的。再发送到消息队列中。事件往往会将事件源包装起来。

事件驱动往往和轮询机制相关,它们通常被统称为 event loop。重点在于并不会给每一个事件分配一个轮询来探知其变化,而是设置一个中央轮询中心,用这个轮询中心去轮询每个注册的对象。轮询中心一旦检测到了注册其中的对象有事件发生,那么就通知对此事件感兴趣的对象。而对此事件感兴趣的对象此时会调用的方法被称为回调函数。

有时也把事件驱动按照实现方式的不同进行区分(个人并不认为很准确,但是很多人都这么说):

  • 轮询方式
    线程不断轮询访问相关事件发生源有没有发生事件,有发生事件就调用事件处理逻辑。
    事件驱动方式
  • 事件发生时主线程把事件放入事件队列,在另外线程不断循环消费事件列表中的事件,调用事件对应的处理逻辑处理事件。事件驱动方式也被称为消息通知方式,其实是设计模式中观察者模式的思路。
    事件驱动模型可以用下图表示(来源于《Software Architecture Patterns》):

在这里插入图片描述

主要包括 4 个基本组件:

事件队列(event queue):接收事件的入口,存储待处理事件
分发器(event mediator):将不同的事件分发到不同的业务逻辑单元
事件通道(event channel):分发器与处理器之间的联系渠道
事件处理器(event processor):实现业务逻辑,处理完成后会发出事件,触发下一步操作
比如说在 Java 的 Socket NIO 模型中,SocketChannel 总是将自身注册为对可读、可写事件感兴趣,ServerSocketChannel 却往往将自己注册为对有一个新的 TCP 连接请求感兴趣。不同的类型的对象可以以不同的兴趣注册到同一个分发器中,分发器既需要能够辨别发生了的不同事件,又需要能够将不同的事件分派给不同的事件通道。因为分发器具备这种为有着不同兴趣的不同对象服务的能力,所以分发器仅仅需要占一个线程。

另一个问题是事件处理器如何知道事件发生了?事件处理器就像人一样,人通过每天时不时地看看报纸、看看手机 APP,”时不时地看“这个动作时由人主动发出的,这是最关键的。处理器需要一个其独享的线程,在这个线程中进行检查是否发生了新的事件,这个线程在没有被通知时是阻塞的,一旦 Event Channel 传来了新的事件,事件处理器就不再阻塞。

所以,有一个单线程不阻塞地进行轮询事件队列,一旦发现事件发生了,就通过事件分发器,将包装好的事件通过事件通道传给事件处理器。而每个事件处理器也单独占据一个线程,如果此时没有事件传递过来,其就会阻塞,直到事件传递过来。

事件队列和事件处理器除了在各自的线程模型是否阻塞上有所区别以外,在实现者上也有所区别。通常事件队列包括分发器、事件通道都是由类库替我们完成的,而事件处理器的逻辑则需要更偏向业务的程序员完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

事件驱动和消息驱动 的相关文章

随机推荐

  • 2022年给正在创作的程序员的实用工具

    文章目录 视频处理音频处理截图 xff0f 图片处理笔记 xff0f 思维导图录屏阿虚的笔记方案 xff08 永久保存文章 xff09 OCR图片文字识别稍后阅读 xff0f 笔记 xff0f 日记 xff0f 记账音频编辑 xff0f 变
  • 【LeetCode刷题日记】373. 查找和最小的K对数字

    题目 给定两个以升序排列的整数数组 nums1 和 nums2 以及一个整数 k 定义一对值 u v xff0c 其中第一个元素来自 nums1 xff0c 第二个元素来自 nums2 请找到和最小的 k 个数对 u1 v1 u2 v2 u
  • IDEA2021新建第一个Spring项目(使用两种方法)

    文章目录 软件版本Spring开发环境搭建 xff0c 软件安装Apache Common Logging APISpring使用两种方法来创建Spring项目1 1使用IDEA新建一个普通项目1 2导入Spring包1 3新建两个java
  • 如何把苍白的一年写成耀眼的年终报告?写完当场加薪的那种

    毕导的文章简直太好玩了 xff1a https mp weixin qq com s Q qd2ky6AoKM1Dn3cC9q9w 啊 xff01 光阴似箭 xff0c 日月如梭 xff01 不知不觉我在公众号写了一年了 xff0c 你也到
  • 【每天一个 Linux 命令】网络相关命令(ifconfig、route、ping、traceroute、netstat、ss、telnet、rcp、scp)

    文章目录 ifconfig命令ifconfig命令使用示例route命令语法route命令使用示例ping命令语法ping命令使用示例traceroute命令语法traceroute命令使用示例netstat命令语法netstat命令使用示
  • Windows常用CMD命令

    参考下面几篇博客 xff1a Windows 用户需要知道的 CMD 常用命令总结 CMD常用命令大全 CMD常用命令
  • PIXHAWK飞行模式

    PIXHAWK飞行模式 从mission planner中设置pixhawk的飞行模式时 xff0c 一共给出了多种飞行模式 xff0c 分别为 xff1a MANUAL STABILIZED ACRO RATTITUDE ALTCTL P
  • FileZilla 通过sftp(ssh)协议远端登录Linux虚拟机

    FileZilla nbsp 通过sftp ssh 协议远端登录Linux虚拟机 参考网址 1 Filezilla连接虚拟机Ubuntu16 04传输文件 生命长跑的博客 CSDN博客 2 问题解决手记 VMWare虚拟机与本地主机不能互p
  • 【Python学习笔记】Python学习资料汇总

    不懂算法的程序员不是好程序员 xff0c 学习Python xff0c 可以更好的使用算法 xff0c 使用ML DL来处理数据 这篇文章就对自己觉得不错的学习资料进行汇总 Python基础教程 xff0c Python入门教程 xff08
  • 【LeetCode刷题日记】1716. 计算力扣银行的钱

    题目 Hercy 想要为购买第一辆车存钱 他 每天 都往力扣银行里存钱 最开始 xff0c 他在周一的时候存入 1 块钱 从周二到周日 xff0c 他每天都比前一天多存入 1 块钱 在接下来每一个周一 xff0c 他都会比 前一个周一 多存
  • 美团人的写作基本功是如何练成的

    在美团 xff0c 王兴非常重视写作 他曾经说过 xff1a 写作是我要带头苦练的基本功 xff0c 是非常基本的能力 因为一个事情要积累的话 xff0c 就得书面化 写作看起来和业务没什么关系 xff0c 但这是一个非常共通的 极其基础的
  • 【LeetCode刷题日记】382. 链表随机节点

    题目 给你一个单链表 xff0c 随机选择链表的一个节点 xff0c 并返回相应的节点值 每个节点 被选中的概率一样 实现 Solution 类 xff1a Solution ListNode head 使用整数数组初始化对象 int ge
  • Python Matplotlib教程

    Python Matplotlib教程 文章目录 Python Matplotlib教程教程特点阅读条件 数据可视化是什么数据可视化数据可视化应用场景 Matplotlib是什么Matplotlib架构组成1 脚本层2 美工层3 后端层 M
  • 【Python学习笔记】认识anaconda

    可以参考下面几篇文章 xff1a Anaconda完全入门指南 Anaconda介绍 安装及使用教程 Anaconda使用教程一 xff08 新手友好 xff09 另外下面总结一下conda的常用命令 xff1a span class to
  • 【Python学习笔记】 if __name__ == ‘__main__‘ 如何正确理解?

    引言 学过Java C C 43 43 的程序员应该都知道 xff0c 每次开启一个程序 xff0c 都必须写一个主函数作为程序的入口 xff0c 也就是我们常说的main函数 如下所示 xff0c main 就是Java中的一个main函
  • 聊聊我常用的5款动态数据可视化工具

    转自 Python大数据分析 xff08 ID xff1a pydatas xff09 视频当道的时代 xff0c 数据可视化自然也要动起来 我常用的动态可视化工具主要有 Tableau Echarts Flourish Python 这几
  • 物联网十年简史

    分享一篇好文 xff1a 万字长文 xff1a 物联网十年简史
  • 【LeetCode刷题日记】539. 最小时间差

    题目 给定一个 24 小时制 xff08 小时 分钟 34 HH MM 34 xff09 的时间列表 xff0c 找出列表中任意两个时间的最小时间差并以分钟数表示 示例 1 xff1a 输入 xff1a timePoints 61 34 2
  • LQR、LQR-MPC、GP-MPC控制倒立摆

    LQR控制倒立摆 xff1a 倒立摆状态方程 xff1a 目标任务 xff1a 模型参数 xff1a LQR for the cart pole system load 39 cp params mat 39 syms phi phid x
  • 事件驱动和消息驱动

    之前简单写过一些关于事件驱动的文章 xff1a C C 43 43 服务器开发 事件驱动 事件驱动架构 事件驱动编程及设计模式 最近看到一篇不错的文章 xff0c 在此转载一下 xff1a 事件驱动和消息驱动 事件驱动和消息驱动 消息驱动和