对事件循环的一点理解

最近工作需要学习了解webworker-threads以应对Javascript多线程处理CPU密集型的可能性;参考文档JavaScript多线程之二 Node.js中的Web Worker;

以下是自己的一次尝试并引发的对于Javascript事件循环机制的一点理解

        var Worker = require(‘webworker-threads‘).Worker; 

        var worker = new Worker(function() {
            console.log(33333)
            postMessage(‘hello, I\‘m send before message‘);
            this.onmessage = function(event) {
                console.log(22222);
                postMessage(‘Hello, I\‘m listening‘);
                console.log(event.data);
            }
        }) 

        worker.onmessage = function(event) {
            console.log(11111)
            console.log(event.data);
        }
        console.log(4444);
        worker.postMessage(‘hello‘); 

输出结果为:

4444
33333
22222
hello
11111
hello, I‘m send before message
11111
Hello, I‘m listening 

那么思考一下这个结果是如何产生的?

首先,确定Javascript是单线程事件循环机制,整体执行顺序如下:

  1. 第一次主线程运行: 输出 4444; 向we bworker发送信息’hello’;
  2. 事件循环第一次: 主线程发送的hello触发子线程: 输出 333333 -> 发送 ‘hello, I\’m send before message’ -> 输出 22222 -> 发送 ‘Hello, I\’m listening’ -> 输出hello;
  3. 事件循环第二次: 输出11111 -> 输出: ‘hello, I\’m send before message’;
  4. 事件循环第三次: 输出11111; 输出: ‘Hello, I\’m listening’

总结: 当前发送的事件触发信号会在下一次事件循环时触发.

时间: 2025-01-11 02:26:06

对事件循环的一点理解的相关文章

nodejs的事件循环1

JavaScript的学习零散而庞杂,因此很多时候我们学到了一些东西,但是却没办法感受到自己的进步,甚至过了不久,就把学到的东西给忘了.为了解决自己的这个困扰,在学习的过程中,我一直试图在寻找一条核心的线索,只要我根据这条线索,我就能够一点一点的进步. 前端基础进阶正是围绕这条线索慢慢展开,而事件循环机制(Event Loop),则是这条线索的最关键的知识点.所以,我就马不停蹄的去深入的学习了事件循环机制,并总结出了这篇文章跟大家分享. 事件循环机制从整体上的告诉了我们所写的JavaScript

深入理解 JavaScript 事件循环(一)— event loop

引言 相信所有学过 JavaScript 都知道它是一门单线程的语言,这也就意味着 JS 无法进行多线程编程,但是 JS 当中却有着无处不在的异步概念 .在初期许多人会把异步理解成类似多线程的编程模式,其实他们中有着很大的差别,要完全理解异步,就需要了解 JS 的运行核心——事件循环(event loop).在之前我对事件循环的认识也是一知半解的,直到我看了 Philip Roberts 的演讲 What the heck is the event loop anyway?,我才对事件循环有了一

QT中的线程与事件循环理解(2)

1. Qt多线程与Qobject的关系 每一个 Qt 应用程序至少有一个事件循环,就是调用了QCoreApplication::exec()的那个事件循环.不过,QThread也可以开启事件循环.只不过这是一个受限于线程内部的事件循环.因此我们将处于调用main()函数的那个线程,并且由QCoreApplication::exec()创建开启的那个事件循环成为主事件循环,或者直接叫主循环.注意,QCoreApplication::exec()只能在调用main()函数的线程调用.主循环所在的线程

JavaScript:彻底理解同步、异步和事件循环(Event Loop) (转)

原文出处:https://segmentfault.com/a/1190000004322358 一. 单线程 我们常说"JavaScript是单线程的". 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个.不妨叫它主线程. 但是实际上还存在其他的线程.例如:处理AJAX请求的线程.处理DOM事件的线程.定时器线程.读写文件的线程(例如在Node.js中)等等.这些线程可能存在于JS引擎之内,也可能存在于JS引擎之外,在此我们不做区分.不妨叫它们工作线程

深入理解JavaScript的事件循环(Event Loop)

一.什么是事件循环 JS的代码执行是基于一种事件循环的机制,之所以称作事件循环,MDN给出的解释为 因为它经常被用于类似如下的方式来实现 while (queue.waitForMessage()) { queue.processNextMessage(); } 如果当前没有任何消息queue.waitForMessage 会等待同步消息到达 我们可以把它当成一种程序结构的模型,处理的方案.更详细的描述可以查看 这篇文章 而JS的运行环境主要有两个:浏览器.Node. 在两个环境下的Event

vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制

一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新. nextTick的触发时机: 在同一事件循环中的数据变化后,DOM完成更新,立即执行nextTick(callback)内的回调. 应用场景: 需要在视图更新之后,基于新的视图进行操作. 以上出现了事件循环的概念,其涉及到JS的运行机制,包括主线程的执行栈.异步队列.异步API.事件循环的协

Node - 浅谈对非阻塞I/O、事件循环的理解

Node.js的主要特点 单线程.非阻塞I/O.事件驱动,这三个特点是相辅相成的. Node为了在低硬件服务器条件下高并发,所以减少了内存消耗,选择单线程: 因为只有一个线程,所以必须非阻塞I/O,每件事情都有回调函数: 为了合理调度,Node使用了事件环的机制,采用事件驱动来调度事件. 非阻塞I/O I/O是输入(input).输出(output)的简称. 阻塞I/O和非阻塞I/O的区别在于系统在输入与输出的期间,能不能接收输入. 举个例子:餐厅服务员招待客人 阻塞I/O:餐厅有多个服务员(多

对javascript EventLoop事件循环机制不一样的理解

前置知识点: 浏览器原理,浏览器内核5种线程及协作,JS引擎单线程设计推荐阅读: 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 [FE]浏览器渲染引擎「内核」 js异步编程,Promise实现推荐阅读: Javascript异步编程的4种方法 前端面试必考题Promise的源码解析 堆.栈.队列.执行栈.任务.微任务.事件循环机制??推荐阅读: JavaScript异步编程-基础篇 彻底搞懂浏览器Event-loop 这一次,彻底弄懂 JavaScript 执行机制 一次弄懂Even

理解 node.js 的事件循环

node.js 的第一个基本观点是,I/O 操作是昂贵的: 目前的编程技术最大的浪费来自等待 I/O 操作的完成.有几种方法可以解决这些对性能的影响(来自Sam Rushing): 同步:依次处理单个请求. 优点:简单. 缺点:任何一个请求都会阻塞其余请求. 创建新进程:为每个请求创建一个进程处理 优点:容易. 缺点:扩展性不好,数百个连接意味着数百个进程.fork()是 Unix 程序员的锤子.因为它很有用,所有的问题都像是钉子.但这通常是多余的. 线程:为每个请求创建一个线程处理. 优点:容