【译】Understanding NodeJS Event Loop

栏目: Node.js · 发布时间: 6年前

内容简介:原文链接思考下这段代码:

原文链接 Understanding NodeJS Event Loop

Event Loop 是个让人头大的知识点,今天我们先了解下Nodejs中的 Event Loop (不要跟浏览器中的Event Loop混淆)。 在这篇文章中,作者将证明Node不完全是单线程的,并向你展示 事件循环 的一般实现。

快速浏览非阻塞I / O.

思考下这段代码:

const crypto = require('crypto')

const start = Date.now()

crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', () => {
  console.log('1:', Date.now() - start)
}) //1: 1015

crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', () => {
  console.log('2:', Date.now() - start)
}) //2: 1021

crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', () => {
  console.log('3:', Date.now() - start)
}) //3: 1017
复制代码

当执行此代码时,所有函数调用都进入 事件循环 。运行代码之后,您会发现这3个函数调用所花费的时间几乎相同。还记得 事件循环 在一个线程中吗?Node是如何在一个线程内并行运行3个操作的?

Node基于C / C ++构建

我们上面观察到的行为是因为Node实现了一个名为 libuv 的C模块。每当在事件循环中发生长时间运行的操作时, libuv 都会将该任务放入另一个线程中。操作结束后, 事件循环 将触发回调去处理结果。

现在,将 crypto.pbkdf2() 函数的调用次数增加到5次,看看会发生什么。

您会发现前4个执行的时间几乎相同,而最后一个执行则需要两倍的时间。在这里,我们遇到了一个 Node 的有趣部分。默认情况下, libuv库 在称为 “线程池” 的东西中启动4个线程。并且这4个线程是并行运行的,这就是为什么4个操作的时间是相同的。因为 线程池 一次只能执行4次操作,所以第五次操作只是等待先前的操作执行完成。这就是第五次操作需要更长时间的原因。

现在,我们来改变操作。这次我们将并行进行 http 调用,看看会发生什么。

const https = require('https')

const start = Date.now()

function makeRequest() {
  https
    .request('https://www.baidu.com', res => {
      res.on('data', () => {})
      res.on('end', () => {
        console.log(Date.now() - start)
      })
    })
    .end()
}

makeRequest() //67
makeRequest() //72
makeRequest() //72
makeRequest() //73
makeRequest() //74
复制代码

你会发现这5个的执行时间几乎相同。我们可以合理地推断出这些 http 调用既不会发生在单线程事件循环中,也不会发生在 线程池 中。所以发生了什么事?

事实证明,一些底层任务(如 http请求 )被委托给操作系统 libuv 。这些任务在 事件循环线程池 之外并行执行。

事件循环 还处理计时器事件,即 setTimeoutsetIntervalsetImmediate 。注册计时器事件时, 事件循环 将等待指定的时间并触发回调。

总之, 事件循环 归结为这三种事件:

1.计时器事件,即 setTimeoutsetIntervalsetImmediate

2.操作系统任务,例如服务器监听和 http 请求。

3.长时间运行的操作,例如 fs操作 和其他 Node API

这是一张图表,用以说明:

【译】Understanding NodeJS Event Loop

感谢@serialcoder 大佬的指导。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

动手玩转Scratch2.0编程

动手玩转Scratch2.0编程

马吉德·马吉 (Majed Marji) / 电子工业出版社 / 2015-10-1 / CNY 69.00

Scratch 是可视化的编程语言,其丰富的学习环境适合所有年龄阶段的人。利用它可以制作交互式程序、富媒体项目,包括动画故事、读书报告、科学实验、游戏和模拟程序等。《动手玩转Scratch2.0编程—STEAM创新教育指南》的目标是将Scratch 作为工具,教会读者最基本的编程概念,同时揭示Scratch 在教学上的强大能力。 《动手玩转Scratch2.0编程—STEAM创新教育指南》共......一起来看看 《动手玩转Scratch2.0编程》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具