• node.js入门笔记2


    1.阻塞与线程

    什么是阻塞(block)呢?
    线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作),通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。
    这种 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O(Blocking I/O)。
     
    异步式 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,线程必须有事件循环,不断地检查有没有未处理的事件,依次予以处理。
     
    Node.js使用的是单线程、非阻塞的时间编程模式。

    2.回调函数

    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. 

    3.事件

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

    事件由EventEmitter对象提供,

    //event.js

    var
    EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); event.on('some_event', function() { console.log('some_event occured.'); }); setTimeout(function() { event.emit('some_event'); }, 1000);

    1秒后控制台输出了 some_event occured.。其原理是 event 对象注册了事件 some_event 的一个监听器,
    然后我们通过 setTimeout 在1000毫秒以后向event 对象发送事件 some_event,此时会调用 some_event 的监听器

    Node.js的事件循环机制

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

    4.模块和包

    Node.js提供了require函数来调用其他模块,而且模块都是基于文件的,机制十分简单。

    (1)什么是模块?

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

    (2)创建以及加载模块

    Node.js 提供了 exportsrequire 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

    (3)创建包

    包是将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。Node.js使用npm来解决包的发布和获取需求。
     
  • 相关阅读:
    11月20日
    11月19日
    11月26日
    11月25日
    生活有感(一)
    c# word 删除指定内容
    mysql insert语句
    c# 删除word文档中某一页
    mysql 相同表结构拷贝数据
    调试再次出错
  • 原文地址:https://www.cnblogs.com/150536FBB/p/13370657.html
Copyright © 2020-2023  润新知