
V8
libuv
第三方模块:c-ares(DNS)、http(parse)、zlib

主流后端语言处理多任务的时候,通常是开多线程。但是当任务量比较少时,线程就会浪费(服务员例子)。因此出现了 Reactor模式(应答者模式),单线程完成多线程工作。可以避免多个线程在上下文切换过程中考虑的状态保存、时间消耗、状态锁。

因此:NodeJS 更适合用于IO密集型高并发请求
同步时间:= 任务一 + 任务二
异步时间:< 任务一 + 任务二

异步IO内部会 轮询 IO 状态,重复调用IO操作,判断IO是否结束。
常见轮询技术:read、select、poll、kqueue、event ports
期望无需主动判断的被阻塞IO ->libuv

NodeJS异步操作过程

异步IO总结
事件驱动架构是软件开发中的通用架构
主体发布消息,原来注册事件的其他实体接收到消息后就会处理响应事件
let eventEmitter = require("events");const myEvent = new eventEmitter();myEvent.on("事件1", function(){console.log("事件1被触发了");
})myEvent.emit("事件1");
单线程如何实现高并发?
异步IO、事件循环加上事件驱动的架构配合事件回调通知
NodeJs主线程是单线程,但是在libuv 库中存在线程池
但是如果处理cpu密集型就不太行了:
const http = require("http");function sleep(time) {const end = Date.now() + time * 1000;while(Date.now() < end) {}return;
}// 睡4秒
sleep(4);const server = http.createServer((req, res) => {res.end("createServer start...");
})server.listen(8080, () => {console.log("服务器启动了");
})

NodeJs 适合IO密集型任务,不适合大量的业务逻辑
import express from "express";
import { DataStore } from './data';const app = express();
app.get("/", (req, res) => {res.json(DataStore.list);
});app.listen(8080, ()=>{console.log("服务开启");
})
"resolveJsonModule": true// json 文件
[{"name": "hyb","age": 18},{"name": "hsf","age": 19}
]// data.ts
import list from "./list.json";
export class DataStore {static list = list
}
// 全局对象
// console.log(global);// 文件和 文件夹路径
// console.log(__filename);
// console.log(__dirname);// 默认情况下 this 是空对象,和 global 是不一样的
console.log(this);
console.log(this == global);// 我们可以理解为,在我们执行js 文件时,内部会帮
// 我们封装成下面立即调用的情况,会将全局对象,全局变量作为
// 参数传进来,所以我们无需引用直接调用
(function(){console.log(this == global);
})()
// 1. 资源: 内存、cpu
// console.log(process.memoryUsage());
// console.log(process.cpuUsage());// 2. 运行环境:运行目录、node环境、cpu架构、用户环境、系统平台
// console.log(process.cwd());
// console.log(process.version);
// console.log(process.versions);
// console.log(process.arch);// console.log(process.env.NODE_ENV);
// console.log(process.env.PATH);
// console.log(process.env.HOME); // USERPROFILE// console.log(process.platform);// 3. 运行状态:启动参数、PID、运行时间
// console.log(process.argv);
// console.log(process.argv0);// console.log(process.pid);
// console.log(process.uptime());// 4. 事件
// process.on("beforeExit", (code) => {
// console.log("before exit " + code);
// })// process.on("exit", (code) => {
// console.log("exit" + code);
// })// console.log("代码执行完毕");// 5. 标准输出 输入 错误
// console.log = function (data) {
// process.stdout.write("---" + data + "\n");
// }// console.log(11);
// console.log(22);// 读取文件
// const fs = require('fs');
// fs.createReadStream('test.txt').pipe(process.stdout);// 读取 和写东西
// process.stdin.pipe(process.stdout);