nodejs

阻塞是指在 Node.js 程序中,其它 JavaScript 语句的执行,必须等待一个非 JavaScript 操作完成。这是因为当 阻塞 发生时,事件循环无法继续运行 JavaScript。

在 Node.js 中,JavaScript 由于执行 CPU 密集型操作,而不是等待一个非 JavaScript 操作(例如 I/O)而表现不佳,通常不被称为 阻塞。在 Node.js 标准库中使用 libuv 的同步方法是最常用的 阻塞 操作。原生模块中也有 阻塞 方法。

在 Node.js 标准库中的所有 I/O 方法都提供异步版本,非阻塞,并且接受回调函数。某些方法也有对应的 阻塞 版本,名字以 Sync 结尾。

我们说nodejs是高并发的,nodejs并发是什么概念呢?

nodejs 无中间件概念,中间件的概念是框架引入的,比如express。express的中间件更类似于插件plugin的概念。

事件循环和执行JavaScript在一个线程里,JavaScript是单线程的。
nodejs调度有阻塞调度和非阻塞调度。
对javascript阻塞的概念:JavaScript的执行必须等一个非JavaScript的操作执行完成,譬如JavaScript执行必须等读取文件结束才能继续执行就是阻塞操作。
而nodejs被称为非阻塞,是因为其JavaScript执行一般不受非JavaScript操作的阻塞,而是受限于CPU密集型操作。

JavaScript是单线程的,定时器是如何工作的呢?

首先 setTimeout 和 setInterval 都不是ECMAScript规范或者任何JavaScript实现的一部分。它是由浏览器实现,并且在不同的浏览器也会有所差异。定时器也可以由 Nodejs 运行时本身实现.
setTimeout和setInterval的运行机制,是将指定的代码移出本轮事件循环,等到下一轮事件循环,再检查是否到了指定时间。如果到了,就执行对应的代码;如果不到,就继续等待。
参考文章:从零开始再学 JavaScript 定时器

除了setTimeout和setInterval这两个方法,Node.js还提供了另外两个与”任务队列”有关的方法:process.nextTick和setImmediate。它们可以帮助我们加深对”任务队列”的理解。

process.nextTick方法可以在当前”执行栈”的尾部—-下一次Event Loop(主线程读取”任务队列”)之前—-触发回调函数。也就是说,它指定的任务总是发生在所有异步任务之前。setImmediate方法则是在当前”任务队列”的尾部添加事件,也就是说,它指定的任务总是在下一次Event Loop时执行,这与setTimeout(fn, 0)很像

参考文章:JavaScript 运行机制详解:再谈Event Loop

官方认为process.nextTick被滥用了,所以提出了setImmediate
参考文章:event-loop-timers-and-nexttick

Node.js 通过事件循环机制(初始化和回调)的方式运行 JavaScript 代码,并且提供了一个线程池处理诸如文件 I/O 等高成本的任务。Node 可伸缩性的秘诀在于它仅使用了极少数的线程就可以处理大量客户端连接。 在 Node 中,有两种类型的线程:一个事件循环线程(也被称为主循环,主线程,事件线程等)。另外一个是在工作线程池里的 k 个工作线程(也被称为线程池)。
Node 使用事件驱动机制:它有一个事件轮询线程负责任务编排,和一个专门处理繁重任务的工作线程池。
参考文章:dont-block-the-event-loop

此条目发表在JavaScript, NodeJs分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注