首页 > 其他分享 >消息队列和事件循环

消息队列和事件循环

时间:2023-12-15 22:33:03浏览次数:24  
标签:队列 主线 任务 循环 线程 事件 页面 消息

每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理 DOM,又要计算样式,还要处理布局,同时还需要处理 JavaScript 任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务,这个统筹调度系统就是消息队列和事件循环系统。

但并不是所有的任务都是在执行之前统一安排好的,大部分情况下,新的任务是在线程运行过程中产生的。比如在线程执行过程中,又接收到了一个新的任务要求计算“10+2”,那上面那种方式就无法处理这种情况了。要想在线程运行过程中,能接收并执行新的任务,就需要采用事件循环机制。

通过引入事件循环机制,就可以让该线程“活”起来了,我们每次输入两个数字,都会打印出两数字相加的结果

消息队列和事件循环_消息队列

一个通用模式是使用消息队列。在解释如何实现之前,我们先说说什么是消息队列,可以参考下图:

消息队列和事件循环_主线程_02

消息队列是一种数据结构,可以存放要执行的任务。它符合队列“先进先出”的特点,也就是说要添加任务的话,添加到队列的尾部;要取出任务的话,从队列头部去取。

有了队列之后,我们就可以继续改造线程模型了。

消息队列和事件循环_消息队列_03

通过使用消息队列,我们实现了线程之间的消息通信。在 Chrome 中,跨进程之间的任务也是频繁发生的,那么如何处理其他进程发送过来的任务?你可以参考下图:

消息队列和事件循环_主线程_04

渲染进程专门有一个 IO 线程用来接收其他进程传进来的消息,接收到消息之后,会将这些消息组装成任务发送给渲染主线程。

当页面主线程执行完成之后,又该如何保证页面主线程能够安全退出呢?Chrome 是这样解决的,确定要退出当前页面时,页面主线程会设置一个退出标志的变量,在每次执行完一个任务时,判断是否有设置退出标志。

  • 如果有一些确定好的任务,可以使用一个单线程来按照顺序处理这些任务,这是第一版线程模型。
  • 要在线程执行过程中接收并处理新的任务,就需要引入循环语句和事件系统,这是第二版线程模型。
  • 如果要接收其他线程发送过来的任务,就需要引入消息队列,这是第三版线程模型。
  • 如果其他进程想要发送任务给页面主线程,那么先通过 IPC 把任务发送给渲染进程的 IO 线程,IO 线程再把任务发送给页面主线程。消息队列机制并不是太灵活,为了适应效率和实时性,引入了微任务。

基于消息队列的设计是目前使用最广的消息架构,无论是安卓还是 Chrome 都采用了类似的任务机制。

标签:队列,主线,任务,循环,线程,事件,页面,消息
From: https://blog.51cto.com/key3feng/8845251

相关文章

  • vue 监听键盘回车事件 @keyup.enter || @keyup.enter.native
    vue运行为v-on在监听键盘事件时,添加了特殊的键盘修饰符:<inputv-on:keyup.13="submit">vue还非常贴心地给出了常用按键的别名,这样就不必去记keyCode~~上面代码,还可以在这样写:<inputv-on:keyup.enter="submit"><[email protected]="submit">全部的键盘别名:.enter.tab......
  • shell补-循环案例-循环case
    shell补-循环案例-循环casecase结构条件的语法格式;一般应用菜单的功能case$变量名in"值1")###如果变量的值1,则执行此程序1;;"值2")###如果变量的值2,则执行此程序2;;###....省略其他分支YES|yes|Yes)#####此处的值,可以带些符号,比如|表示或者;也可以用[a-z]感觉......
  • 金融茶事件-骗局
    骗局也卷。”这位00后,不讲武德,完全打破行业的玩法,把周期从1~2年,缩短到3个月。玩家基于经验和诱惑,参与进来玩,准备跟00后一起收割别人;谁知道这次,镰刀直接把同行伙伴给割了。”-------------------------------------------------------------------转发一个高手透视最近网上热议的......
  • 【合并排序链表】分治/优先队列
    合并两个排序链表模拟维护一个合并链表,每次添加两个排序链表中较小val的节点即可模拟代码publicListNodemergeTwo(ListNodea,ListNodeb){if(a==null)returnb;if(b==null)returna;ListNodeans=newListNode(0);Lis......
  • 记录rabbitMQ的广播队列的错误使用导致未能正确广播的问题
    背景说明:有3个服务S1、S2、S3现在服务S1需要发布消息到广播交换机E,并建立了两个普通队列Q1,Q2,将其绑定到广播交换机E上服务S2和服务S3同时监听队列Q1,Q2本意是,服务S1通过广播交换机E把消息同时推送给服务S2和S3后面测试时,同事发现,服务S2和服务S3都只接收到了部分消息,而不是全......
  • 清空ActiveMQ中的Scheduled延时队列
    要清空ActiveMQ中的Scheduled延时队列,可以执行以下步骤:停止ActiveMQ服务器。在ActiveMQ数据存储目录中找到存储延时消息的目录。该目录的默认位置是<activemq_home>/data/localhost/Scheduled.删除该目录下的所有文件,这将清空延时队列中的消息。启动ActiveMQ服务器。请注意......
  • Java中的消息队列(MQ)应用实践
    摘要:本文将介绍Java中消息队列(MQ)的概念、应用场景以及如何使用Java中的消息队列进行实践。我们将探讨如何使用Java消息队列实现异步通信、解耦和流量削峰等常见需求,并通过实际案例展示其应用。一、引言在分布式系统中,消息队列(MQ)是一种常见的中间件技术,用于实现异步通信和解耦。通过......
  • CRM系统,助力企业应对灰犀牛事件
    近年来,经济环境稳定性下降,“灰犀牛事件频发”。然而,借助CRM客户管理软件,企业管理者能够提前对灰犀牛的量级进行预判,甚至将危机转化为机遇,获取新的增长点。本文将向您介绍,企业如何运用CRM应对频发的灰犀牛事件?“黑天鹅”与“灰犀牛”“黑天鹅事件”是指那些不可预知的,概率极小的......
  • 九、条件控制与循环
    九、条件控制与循环9.1条件判断​ 有的时候在执行任务的时候需要对不同的情况做判断,以此来决定是否执行某些任务。什么情况下需要使用条件判断?判断主机的硬件资源,如CPU、内存、磁盘空间是否满足要求,如满足再执行task捕获一个命令的输出,根据命令输出结果的不同触发不同的task......
  • bootstraptable 全事件 触发事件 表格事件及fastadmin 的使用方法案例
     Option事件jQuery事件参数描述onAllall.bs.tablename,args所有的事件都会触发该事件,参数包括:name:事件名,args:事件的参数。onClickRowclick-row.bs.tablerow,$element当用户点击某一行的时候触发,参数包括:row:点击行的数据,$element:tr元素,field:点击列的field......