node.js是单线程的应用程序,但是他可能通过event和callback来支持并发。所有的node.js都是单线程的,也是异步的,他们使用调用异步函数来维持高并发。Node使用观察者模式。Node的线程会保持一个事件循环,当有任务完成时,他会触发相应的事件,通知事件监听函数执行。
事件驱动程序
node.js大量的使用事件,这也是和其他相同技术相比更快的原因。当Node被启动时,初始他的变量,和声明方法,而后等待事件的发生。
在一个事件驱动应用程序内,一般会有一个主要的循环用于事件监听,当有一个事件被发现就会触发相应的回调函数。 
事件循环和回调(callback)特别像,他们的不同之处在于,回调函数(callback)只有在异步函数执行完后才被会被执行调用,而事件处理工作于观察者模式。监听事件行为的函数就像观察者,当有一个事件被触发,它的监听函数就开始执行。通过内置的事件模块和EventEmitter类可以使用很多Node.js内置事件。他们是用于绑定事件和事件监听的,如下所示
var events = require('events');
var eventEmitter = new events.EventEmitter();

  下面的语法是使用一个事件来绑定事件处理函数

eventEmitter.on('eventName', eventHandler);

  我们可以通过编码来触发事件

eventEmitter.emit('eventName');

  例如: 创建一个名字为main.js的js文件,并填入下面的代码

// Import events module
var events = require('events');// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();// Create an event handler as follows
var connectHandler = function connected() {console.log('connection succesful.');// Fire the data_received event eventEmitter.emit('data_received');
}// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function(){console.log('data received succesfully.');
});// Fire the connection event
eventEmitter.emit('connection');console.log("Program Ended.");

现在让我们来运行上面的代码并查看他的输出

$ node main.js

他会输出下面的结果

connection successful.
data received successfully.
Program Ended.

Node程序是如何运行的。
在node应用程序内,很多异步的方法的最后一个参数为回调方法(callback),并且这个回调方法的第一个参数为error。让我们再看一下上面的例子,创建一个input.txt文件,填入下面的内容: 
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

创建一个js文件命名为main.js,填入下面的代码

var fs = require("fs");fs.readFile('input.txt', function (err, data) {if (err){console.log(err.stack);return;}console.log(data.toString());
});
console.log("Program Ended");

readFile是一个异步的函数,用于读取文件,在读取期间如果有错误发生,err对象会包含相应的错误,如果没有错误,data对象会包含读取的文件内容,读取操作完成后readFile传递一个err和data参数给回调函数,下面是最终的输出。

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

  还有一篇讲事件循环的文章很不错,有时间 大家可以读一下:

https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/

node.js 事件循环相关推荐

  1. Linux事件循环阻塞,深入浅析Node.js 事件循环、定时器和process.nextTick()

    什么是事件循环 尽管JavaScript是单线程的,但通过尽可能将操作放到系统内核执行,事件循环允许Node.js执行非阻塞I/O操作. 由于现代大多数内核都是多线程的,因此它们可以处理在后台执行的多 ...

  2. 八七、Node.js事件循环与多进程

    nodejs事件循环与多进程 why 事件循环对于深入理解nodejs异步至关重要 fs, net,http,events 事件循环是企业面试中的最高频考题之一 能驾驭nodejs多进程是一名资深前端 ...

  3. JS事件循环机制:同步与异步任务 之 宏任务 微任务

    JS事件循环机制:同步与异步任务 之 宏任务 微任务 阅读目录 javascript事件循环 setTimeout和setInterval中的执行时间 宏任务和微任务 javascript是单线程,一 ...

  4. 面试率 90% 的JS事件循环Event Loop,看这篇就够了!! !

    面试率 90% 的JS事件循环Event Loop,看这篇就够了!! ! 事件循环(Event Loop)大家应该并不陌生,它是前端极其重要的基础知识.在平时的讨论或者面试中也是一个非常高频的话题. ...

  5. 详解浏览器和Node的事件循环机制及区别

    关于事件循环机制(详解) 前言 一.浏览器的事件循环机制 二.Node的事件循环机制 三.两者的区别 前言 JS是单线程的脚本语言,即在同一时间只能做一件事.为了协调时间.用户交互.脚本.UI渲染和网 ...

  6. 如何构建自定义 Node.js 事件发射器

    事件是具有软件或硬件意义的动作. 它们是由于用户活动(例如鼠标单击或击键)或直接来自系统(例如错误或通知)而发出的. JavaScript 语言使我们能够通过在事件处理程序中运行代码来响应事件. 由于 ...

  7. JS事件循环 Event Loop

    前言 刚学前端的时候一直听别人说 JS 是单线程.单线程.单线程的,其实完整的应该是在浏览器环境下 JS 执行引擎是单线程的. 那么什么是线程?为什么JS是单线程的? 1. 进程和线程 进程和线程的主 ...

  8. js事件循环——看输出顺序

    js事件循环: 由于js是单线程的,同一时间只能干一件事情,当期宿主环境为浏览器时,若一个任务耗时过长会导致页面阻塞.因此有了js事件循环机制,它将任务分成同步任务和异步任务,同步任务在主线程不断执行 ...

  9. JS事件循环中的宏任务和微任务执行顺序

    1. 宏任务和微任务事件 其中微任务的优先级高于宏任务,括号内为事件运行环境 宏任务 微任务 I/O事件/onClick点击事件 process.netTick (Node) setTimeout N ...

最新文章

  1. python三层架构
  2. 通用httpclient生成方式
  3. 单纯形 c语言 程序,单纯形法完全c语言程序
  4. 香帅的北大金融学课笔记16 -- 公司决策
  5. linux lw3m多行文本使用,linux常用命令以及一些常见问题和解决方法教程.docx
  6. 东南亚版“QQ 音乐”:JOOX 的音乐推荐重构之路
  7. Facebook市值首次突破1万亿美元
  8. SuperMap BIM+GIS技术白皮书
  9. 浅谈CDN技术的发展历程
  10. 阿里安全SQL注入检测 前五名队伍分享
  11. 1分钟恢复损坏的Excel文件
  12. 按是否运行源代码划分: 静态测试和动态测试
  13. 什么是DNS泄漏?我为什么要关心?
  14. Window7开机速度有点慢的解决办法
  15. c++11线程池的实现原理及回调函数的使用
  16. 网络基础:(二)路由选择基础与静态路由
  17. canvas画地图运动轨迹【自己定位】
  18. Python:for循环语句
  19. mpvue项目中使用第三方UI组件库
  20. [附源码]Python计算机毕业设计动物保护资讯推荐网站

热门文章

  1. hadoop和hdfs命令_Hadoop 1.x和2.x HDFS基本开发人员命令,“ hadoop”命令
  2. 人工智能在塑造未来移动应用开发中的作用
  3. 核心金融场景分布式事务
  4. Outlook 2013中 IMAP配置
  5. spring : springmvc常用注解标签详解(转)
  6. Datagard產生gap
  7. 个推 Spark实践教你绕过开发那些“坑”
  8. C# Winform添加全局快捷键(老板键)
  9. “间谍”软件克星Ad-Aware
  10. xen虚拟化部署遇到的问题(持续更新)