Node.js的非阻塞I/O、异步与事件驱动介绍

1、Node.js的单线程 非阻塞 I/O 事件驱动

在 Java、PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。
而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了。
Node.js 不为每个客户连接创建一个新的线程, 而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。
使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。

2、Node.js回调处理异步

//错误的写法:
function getData(){
    //模拟请求数据
    var result='';
    setTimeout
    (function(){
        result='这是请求到的数据'
        },200);
        return result;
}
console.log(getData());/*异步导致请求不到数据*/

//正确的处理异步:
function getData(callback){
    //模拟请求数据
    var result='';
    setTimeout
    (function(){
        result='这是请求到的数据';
        callback(result);
        },200);
    }
    getData(function(data){
    console.log(data);
})

3、Node.js events模块处理异步

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter类来绑定和监听事件。

// 引入 events 模块
var events = require('events');
var EventEmitter=new events.EventEmitter(); /*实例化事件对象*/
EventEmitter.on
('toparent',function(){
console.log('接收到了广播事件');
})
setTimeout
(function(){
    console.log('广播');
    EventEmitter.emit
    ('toparent'); /*发送广播*/
},1000)

Node.js 事件循环

/*
 Node.js 事件循环:

 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

 Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,

 */

// 引入 events 模块
var events = require('events');

var EventEmitter = new events.EventEmitter();

//监听to_mime的广播
EventEmitter.on('to_mime', function (data) {
  console.log(data, '接收to_mime的数据');
})

//监听to_parent的广播
EventEmitter.on('to_parent', function (data) {
  console.log(data, '接收to_parent的数据');
  //广播to_mime事件
  EventEmitter.emit('to_mime', '发送to_mime的数据')
})

setTimeout(function () {
  console.log('开始广播...');
  //广播to_parent事件
  EventEmitter.emit('to_parent', '发送to_parent的数据')
}, 1000);

执行结果

开始广播...
发送to_parent的数据 接收to_parent的数据
发送to_mime的数据 接收to_mime的数据

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

(0)

相关推荐

  • node.js文件系统模块和两个重要模块

    目录 一.node.js文件系统模块 node.js fs文件系统 读取文件 写入文件 二.node.js的两个重要模块 path路径模块 http模块 一.node.js文件系统模块 node.js javascript之所以能够被浏览器执行是因为有javascript的解析引擎的作用,而不同的浏览器使用不同的JavaScript的解析引擎,Chrome浏览器使用的v8解析引擎,体验最好,浏览器内置dom和bom的api函数,JavaScript可以调用这些函数来完成相应的功能 node.js

  • Node.js基础模块babel使用详解

    目录 安装配置 使用babel 实际例子 类的转化 babel-polyfill 前言: 由于ES6到ES7增加了很多新的语法,新特性的出现使得大家都希望通过新语法来提升自身的开发效率,但在之前的最新的node可能也没有百分之百的支持ES2017的新特性,而且开发者在开发环境和生产环境中的版本一般是不同的,所以新特性的代码可能不能完美的运行在线上环境中,为了解决难题,babel提供一系列的api来将新特性的语法转化成低版本环境中能够运行的代码 安装配置 babel是由一系列的组件构成,所以我们在

  • Node.js中的package.json与cnpm命令行工具介绍

    一.包 Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理. 完全符合 CommonJs 规范的包目录一般包含如下这些文件. package.json :包描述文件. bin :用于存放可执行二进制文件的目录. lib :用于存放 JavaScript 代码的目录. doc :用于存放文档的目录. 在 NodeJs 中通过 NPM 命令来下载第三方的模块(包). http

  • Node.js中fs模块的使用方法

    引入fs模块 var fs=require('fs'); 1. fs.stat检测是文件还是目录 fs.stat('html/style.css', function (err, stats) { if (err) { console.log(err); return false; } console.log('文件:' + stats.isFile()); // true console.log('目录:' + stats.isDirectory()); // false }) 2. fs.m

  • Node.js的HTTP模块、URL模块与supervisor工具介绍

    一.Node.js创建第一个应用 如果我们使用 PHP 来编写后端的代码时,需要 Apache 或者 Nginx 的 HTTP 服务器, 来处理客户端的请求相应.不过对 Node.js 来说,概念完全不一样了.使用 Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器. 1.引入 http 模块 var http = require("http"); 2.创建服务器 接下来我们使用 http.createServer() 方法创建服务器,并使用 listen

  • Node.js入门笔记 之async模块

    目录 前言 async series parallel waterfall map 前言 前面我们介绍了异步模块的CPS解决嵌套回调的方法,但是随着业务的推进,node的更新方法也越来越快,对于异步的处理会有更多的新的方法来解决,最常见的当然是async模块来解决异步请求,这一节就来记录一下async模块的应用,对异步的处理更进一步台阶 async async不同于ES2017的新特性,这里的async表示的是node的第三方模块,也是一个比较出名的第三方模块,为了解决异步嵌套的回调地狱的问题,

  • node.js中的模块化标准CommonJS与自定义模块

    一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一个用于更广泛的应用程序的标准库. CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷. 它的终极目标就是: 提供一个类似 Python, Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶段.用 CommonJS API 编写出的应用, 不仅可以利

  • Node.js Continuation Passing Style( CPS与回调)

    目录 前言 嵌套回调 回调地狱 回调与CPS 前言 前面我们介绍了node的基础模块,今天我们来实践一个更加进阶的写法,那就是node的异步处理,由于过多的事件堆积在一起嵌套使用容易引起回调地狱,所以在日常开发中异步的使用显得异常的重要,在开发中我们也经常会遇到某些接口需要先后调用的问题,那么异步是一个很好的解决方案,所以今天来给这个知识点做一个笔记. 嵌套回调 我们先用一个小栗子,书写一个方法接受一个参数并将参数读取的数据返回,简单来封装一个文件读取的方法. var fs = require(

  • Node.js的非阻塞I/O、异步与事件驱动介绍

    1.Node.js的单线程 非阻塞 I/O 事件驱动 在 Java.PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程.而每个线程需要耗费大约 2MB 内存.也就是说,理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右.要让 Web 应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了.Node.js 不为每个客户连接创建一个新的线程, 而仅仅使用一个线程.当有用户连接了,就触发一个内部事件,通过非阻塞 

  • Node中对非阻塞I/O、事件循环的知识点总结

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

  • Node.js模拟发起http请求从异步转同步的5种用法

    使用 Node.js 模拟发起 http 请求很常用的,但是由于 Node 模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库 API 从异步转同步的几种方法.模块有: request , request-promise , request-promise-native , request-promise-any PS: Node的版本>=8.0.0 为了使用 Async / Await PS: 这里加入 auth 字段是为了需要用户

  • Node.js中文件操作模块File System的详细介绍

    File System的缩写是fs,该模块提供本地文件的读写能力. Nodejs导入文件系统模块(fs)语法如下所示: var fs = require("fs"); 异步和同步 Node.js文件系统(fs模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync() . 异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error).同步则没有回调函数. 建议大家是用异步方法,比起同步

  • node.js中http模块和url模块的简单介绍

    前言 本文主要给大家介绍了关于node.js中http模块与url模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务器 var server = http.createServer((req,res)=>{ }); 使用http的.createServer()方法可以

  • Node.js开发者必须了解的4个JS要点

    本文为开发者总结了4个Node.js要点. 1. 非阻塞(Non-blocking)或异步I/O 由于Node.js一个服务器端框架,所以它主要工作之一是处理浏览器请求.在传统的I/O系统中,每个请求的发出都是在上一请求到达之后才发出的.所以这被称为阻塞(blocking)I/O.服务器会阻挡其它的请求以处理当前请求,从而导致浏览器等待. Node.js不以这种方式来进行I/O处理.如果一个请求需要长时间处理,Node.js会把该请求发送给一个事件循环(event loop),然后继续处理在调用

  • 深入浅析Node.js 事件循环、定时器和process.nextTick()

    什么是事件循环 尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作. 由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多个操作. 当其中一个操作完成时,内核会告诉Node.js,以便可以将相应的回调添加到 轮询队列 中以最终执行. 我们将在本主题后面进一步详细解释. 事件循环解释 当Node.js启动时,它初始化事件循环,处理提供的输入脚本(或放入 REPL ,本文档未涉及),这可能会进行异步API调用,调度计时器或

  • Node.js异步I/O学习笔记

    "异步"这个名词的大规模流行是在Web 2.0浪潮中,它伴随着Javascript和AJAX席卷了Web.但在绝大多数高级编程语言中,异步并不多见.PHP最能体现这个特点:它不仅屏蔽了异步,甚至连多线程也不提供,PHP都是以同步阻塞的方式来执行.这样的优点利于程序猿顺序编写业务逻辑,但在复杂的网络应用中,阻塞导致它无法更好地并发. 在服务器端,I/O非常昂贵,分布式I/O更加昂贵,只有后端能快速响应资源,前端的体验才能变得更好.Node.js是首个将异步作为主要编程方式和设计理念的平台

  • Node.js 异步编程之 Callback介绍(一)

    Node.js 基于 JavaScript 引擎 v8,是单线程的.Node.js 采用了与通常 Web 上的 JavaScript 异步编程的方式来处理会造成阻塞的I/O操作.在 Node.js 中读取文件.访问数据库.网络请求等等都有可能是异步的.对于 Node.js 新人或者从其他语言背景迁移到 Node.js 上的开发者来说,异步编程是比较痛苦的一部分.本章将由浅入深为大家讲解 Node.js 异步编程的方方面面.从最基础的 callback 到 thunk.Promise.co 直到

  • Node.js 的异步 IO 性能探讨

    Python 和 Ruby 也有这样的框架,但因为在实际使用中会不可避免地用到含有同步代码的库,因此没能成长起来,而在 Node.js 之前,JavaScript 的服务器端编程几乎是空白,所以 Node.js 才得以建立起了一个所有 IO 均为异步的代码库. 大部分 Web 应用的瓶颈都在 IO, 即读写磁盘,读写网络,读写数据库.使用怎样的策略等待这段时间,就成了改善性能的关键点. PHP 的策略:多进程运行,直接原地等待 IO 完成.缺点:多个进程会消耗多份内存,进程间难以共享数据. C/

随机推荐