https://github.com/veaba/learn-node
learn node.js
https://github.com/veaba/learn-node
Last synced: about 1 year ago
JSON representation
learn node.js
- Host: GitHub
- URL: https://github.com/veaba/learn-node
- Owner: veaba
- Created: 2019-01-11T02:34:37.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2019-12-30T08:31:17.000Z (over 6 years ago)
- Last Synced: 2025-01-30T17:39:39.862Z (over 1 year ago)
- Language: JavaScript
- Size: 27.3 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## 学习 node.js
## 学习一些api 的方法和使用
## node线程
- node 是单线程进程
- 特点:
- JS引擎只有一个实例
- 事件驱动处理IO等异步
- 可能更适合IO密集型操作
- 优点:减少线程间切换的开销
- 缺点:
- 无法让主线程进行CPU密集型操作,会阻塞主线程
- cpu 密集型(计算),可以通过child_process 创建独立的子进程,父子进程通过IPC通信(进程间通信),子进程可以是外部程序,结果返回给父进程
- IPC通信:进程间通信,科普:https://www.cnblogs.com/CheeseZH/p/5264465.html
- node 不是单线程:严格说,node不是单线程!
- js引擎执行的线程
- 定时器线程(setTimeout,setInterval)
- 异步http线程(ajax)
- node 一般单线程说法:
- 只有一个JS引擎在主线程上运行
- 其他异步IO和事件驱动相关线程通过libuv实现内部的线程池和线程调度
- libuv 存在 Event Loop,通过它来实现多线程效果
- Event Loop:维持一个执行栈和一个事件队列
- node 单进程:线程是最小进程,因此node 也是单进程。(node 是单进程、单线程的原因)
- CPU密集
- 计算、逻辑判断
- IO密集操作
- 网络通讯、网络传输、磁盘读写
- libuv:跨平台高性能、事件驱动的I/O库
- node 提供 child_process 模块实现多进程
- 子进程:也叫工作进程,worker
- 可以调用非Node命令,如python、shell、以流或回调形式返回
- 主进程:master进程
### child_process API
- spawn:非Node应用、流的形式返回、不能直接运行shell命令
- execFile:非Node应用、流的形式返回
|类型|spawn|execeFile|exec|fork|
|----|----|----|----|----|
|是否Node应用|否|否|否|是|
|返回结果|流|回调|回调|流|
|是否直接执行shell|否|否|是|否|
#### exec
- 安全性比较低
```js
const cp= require('child_porcess')
cp.execFile('echo hello world'],functionc(err,stdout){
console.log(setout)
})
```
#### execFile
- 安全性高
- 会检查入参安全性
```js
const cp= require('child_porcess')
cp.execFile('echo',['hello','world'],functionc(err,stdout){
console.log(setout)
})
```
#### spawn
```js
const cp=require('child_process')
const cat= cp.spawn('cat',['input.txt'])
const sort=cp.spawn('sort')
const uniq=cp.spawn('uniq')
cat.stdout.pipe('sort.stdin')
sort.stdout.pipe('uniq.stdin')
uniq.stdout.pipe(process.stdout)
console.log(porcess.stdout)
```
#### fork
- 子进程
- process.on('message')接收消息、process.send()发送消息
- 父进程
- child.on('message')接收消息、child.send() 发送消息