总结
用libuv进行异步I/O操作
用event loop 管理事件处理顺序
用C/C++库高效处理DNS/HTTP…
用bindings让JS能和C/C++沟通
用V8运行JS
用Node.js标准库简化JS代码
一些有用的工具
node-dev
当文件更新时自动重启 node
不宜在生产环境使用
ts-node
让node支持直接运行TypeScript代码
不宜在生产环境使用
ts-node-dev
这个工具结合了上面两个工具
不宜在生产环境使用,但可以用来学习时使用
curl
GET请求:curl -v url
POST请求: curl -v -d “name=frank” url
设置请求头: -H
‘Content-Type:application/json’
设置动词: -X PUT
JSON请求: curl -d’{“name”:“bob”}’-H ‘Content-Type:application/json’ url
curl构造请求
stream
source → data → stream → sink
数据从source发出从stream到达sink的过程就是流。
管道
两个流可以用一个管道相连A末尾连接上B的开端,A的数据会流向B
常用代码stream.pipe(stream2)
链式操作
a.pipe(b).pipe(c)
// 等价于
a.pipe(b)
b.pipe(c)
支持的事件和方法
Stream分类
名称 | 特点 |
---|---|
Readable | 可读 |
Writable | 可写 |
Duplex | 可读可写(双向) |
Transform | 可读可写(变化) |
Readable Stream
静止态 paused 和 流动态 flowing
默认处于paused态
添加data事件监听,它就变为flowing态
删除data事件监听,它就变为paused态
pause() 可以将它变为paused
resume() 可以将它变为flowing
Writable Stream
drain通过流完成传输后,可以加点数据
调用stream.write(chunk)的时候,可能会false(数据传输过快,数据积压了)
这时不能再write,要监听drain,等drain事件触发了,我们才能继续write
finish 事件
调用stream.end()之后而且缓冲区数据都已经传给底层系统以后,
触发finish事件
数据流中的积压问题(背压 Back Pressure)
Stream 用途非常广 - 在Node.js里随处可见
进程
进程是程序的执行实例
程序在CPU上执行时的活动叫做进程
一个进程可以创建另一个进程
CPU
一个单核的CPU可以多个进程并行
指多个程序在宏观上并行,微观上串行
每个进程会出现[执行 - 暂停 - 执行]的规律
多个进程之间会出现抢资源的现象(如打印机)
阻塞
等待执行的进程
都是非运行态
一些A在等CPU资源
一些B在等I/O完成
把CPU分配给B进程,B还是在等I/O(阻塞进程)
因此,分派程序只会把CPU分配给非阻塞进程(在等I/O的都是阻塞进程)
进程的三种状态:就绪态 - 运行态 - 阻塞态
线程
在面向进程设计的系统中,进程是程序的基本执行实体
在面向线程设计的系统中,进程本身不是基本运行单位
引入原因
进程是执行的基本实体,也是资源分配的基本实体
导致进程的创建、切换、销毁太消耗CPU时间了
于是引入线程,线程作为执行的基本实体
而进程只作为资源分配的基本实体
概念
CPU调度和执行的最小单元
一个进程中至少有一个线程,可以有多个线程
一个进程中的线程共享该进程的所有资源
进程的第一个线程叫做初始化线程
线程的调度可以由操作系统负责,也可以由用户自己负责
子进程(child_process)
子进程的运行结果存储在系统缓存之中(最大200kb)
等到子进程运行结束以后,主进程再用回调函数读取子进程的运行结果
使用:execFile 用于执行命令
使用:spawn 用法与execFile方法类似
没有回调函数,只能通过流事件获取结果,没有最大200kb的限制
经验:能有spawn就不要用execFile
使用:fork 创建一个子进程,执行node脚本
会多出一个message事件,用于父子通信
会多出一个send方法