Nodejs 异步式 I/O 与事件式编程

Node.js 最大的特点就是异步式 I/O(或者非阻塞 I/O)与事件紧密结合的编程模式。这 种模式与传统的同步式 I/O 线性的编程思路有很大的不同,因为控制流很大程度上要靠事件 和回调函数来组织,一个逻辑要拆分为若干个单元

什么是阻塞(block)呢?线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作), 通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同 时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统 将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种 I/O 模式就是通 常的同步式 I/O(Synchronous I/O)或阻塞式 I/O (Blocking I/O)。 4

相应地,异步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)则针对 所有 I/O 操作不采用阻塞的策略。当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作 的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作 系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个 事件。为了处理异步 I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次予 以处理。

阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞 模式下,一个线程永远在执行计算操作,这个线程所使用的 CPU 核心利用率永远是 100%, I/O 以事件的方式通知。在阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞 时还有其他线程在工作,多线程可以让 CPU 资源不被阻塞中的线程浪费。而在非阻塞模式 下,线程不会被 I/O 阻塞,永远在利用 CPU。多线程带来的好处仅仅是在多核 CPU 的情况 下利用更多的核,而Node.js的单线程也能带来同样的好处。这就是为什么 Node.js 使用了单 线程、非阻塞的事件编程模式

回调函数

//readfile.js

var fs = require(‘fs‘);
fs.readFile(‘file.txt‘, ‘utf-8‘, function(err, data) {

if (err) { console.error(err);

} else { console.log(data);

} });

    console.log(‘end.‘);

运行的结果如下:

    end.
    Contents of the file.
看到没有各位 先输出end  后才输出内容,为什么这样啊?因为是异步非阻塞的。function就是一个回调函数 。在 Node.js 中,异步式 I/O 是通过回调函数来实现的

fs.readFile 调用时所做的工作只是将异步式 I/O 请求发送给了操作系统,然后立即返回并执行后面的语句,执行完以后进入事件循环监听事件。当 fs 接收到 I/O 请求完成的事件时,事件循环会主动调用回调函数以完成后续工作。因此我们会先看到 end.,再看到file.txt 文件的内容

Node.js 中,并不是所有的 API 都提供了同步和异步版本。Node.js 不鼓励使用同步IO

Node.js 的事件循环机制

Node.js 在什么时候会进入事件循环呢?答案是 Node.js 程序由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数,所以 Node.js 始终在事件循环中,程序入口就是事件循环第一个事件的回调函数。事件的回调函数在执行的过程中,可能会发出 I/O 请求或直接发射(emit)事件,执行完毕后再返回事件循环,事件循环会检查事件队列中有没有未处理的事件,直到程序结束

模块和包

什么是模块?

模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展

创建及加载模块

时间: 2024-08-01 06:31:12

Nodejs 异步式 I/O 与事件式编程的相关文章

C++ 异步IO (一) 阻塞式HTTP客户端

An IO call is synchronous if, when you call it, it does not return until the operation is completed, or until enough time has passed that your network stack gives up. 简单来说,IO的函数后面的代码不会被执行,除非IO函数已返回,或函数超时了. /* For sockaddr_in */ #include <netinet/in.h

Nodejs异步异常处理domain

前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nodejs都是异步异常,try..catch根本就捕捉不到,就会给我们的程序设计带来不小的麻烦,经常会有未处理的runtime异常,让整个系统挂掉. 目录 Nodejs异常处理 Nodejs异步异常处理 domain介绍 domain的API介绍 domain异步异常特例 1. Nodejs同步异常处理

深入浅出NodeJS——异步I/O

底层操作系统,异步通过信号量.消息等方式有着广泛的应用. PHP语言从头到尾都是以同步阻塞方式运行,利于程序员顺序编写业务逻辑. 异步I/O.事件驱动.单线程构成Node的基调. why异步I/O (1).用户体验 在Web2.0中Ajax广泛应用异步刷新机制可以更好的提高用户体验,消除UI阻塞.后端同样采用异步I/O可以有效较少同时请求多个资源的效应时间其为max(M,N). (2).资源分配 多任务主流方式: a. 单线程异步I/O b. 多线程并行 多线程的代价在于创建线程和执行期线程上下

深入浅出NodeJS——异步编程

函数式编程 Javascript中函数作为一等公民,函数看成普通对象,可以作为参数或者返回值. 高阶函数:函数作为参数或者将函数作为返回值的函数 异步编程优势 基于事件驱动的非阻塞I/O模型 异步编程难点 (1) 异常处理,通常try/catch不一定适用,因为callback并不是在当前Tick中执行. Node在异常处理中约定将异常作为回调函数的第一个实参传回. (2)  函数嵌套过深 (3) 代码阻塞:没有sleep函数,通过setInterval()和setTimeout()模拟 (4)

FreeRTOS——任务调度—抢占式,时间片和合作式

本章教程为大家将介绍 FreeRTOS 操作系统支持的任务调度方式:抢占式,时间片和合作式,这部分算是 FreeRTOS 操作系统的核心了. 对于初学者来说,要一下子就能够理解这些比较困难,需要多花些时间把这些基本概念搞清楚,然后阅读下源码,深入理解实现方法. 关于合作式调度器的特别说明 FreeRTOS 支持的调度方式FreeRTOS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度. 实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少. ? 抢占式调度每个任务都有不同的优

Node.js之路【第三篇】NodeJS异步实现

NodeJS异步实现 Node.js异步编程的直接体现就是回调,它依托于回调来实现,但不能说使用了回调他就是异步了 回调函数在完成任务后就会被调用,Node使用了大量的回调函数,Node所有的API都支持回调函数 例如:我们可以一边读取文件一边执行其他命令,在文件读取完成后,我们将文件内容作为回调的参数返回,这样执行代码的时候就不会有阻塞或等待I/O操作 这样就打打提高了Node.js性能,可以处理大量的并发请求. 一.阻塞代码示例 1.创建一个测试文件text.txt文件内容如下: 文件I/O

响应式编程是一种异步的、声名式的、面向数据流的编程范式

响应式编程是一种异步的.声名式的.面向数据流的编程范式. 异步:moand.observeable.handle: 声名式:用逻辑表述的形式组织代码:使用函数式编程范式. 数据流:将数据视作数据流的形式,并用pipeline的形式做处理. rx是对响应式编程操作的标准化. Each language-specific implementation of ReactiveX implements a set of operators. Although there is much overlap

jQuery异步加载数据添加事件

几个月前在一个项目中涉及到树形栏,然后看了很多插件,觉得有点麻烦,于是自己写了一个,写着写着就出问题了.当时项目是通过树形栏进行权限控制的,管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作,可是用$(".XX").click();方法是不行的.1.之前用的是jq1.4.3 ,jq1.7一下都可以使用live()方法,来实现该功能 $('#div').live('click',function(){ //do stuff }); 但是live方法也有不支持的事件,例如:togg

CSS的三种样式:内联式,嵌入式,外部式以及他们的优先级

从CSS 样式代码插入的形式来看基本能够分为下面3种:内联式.嵌入式和外部式三种. 1:内联式css样式表就是把css代码直接写在现有的HTML标签中,如以下代码: <p style="color:red";font-size:12px>这里文字是红色.</p> 2:嵌入式,嵌入式css样式.就是能够把css样式代码写在<style type="text/css">XXX</style>标签之间. <head&g