-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
13 - Node #13
Comments
3 - 异步 I/OI/O 概念
理想情况下 非阻塞I/O
浏览器处理 事件循环 模型?Node事件循环 处理非阻塞I/O机制 (和浏览器不一样了哦)
setTimeout, setInterval / process.nextTick / setImmediate
|
4 - 多进程创建 - child_process.fork() 模式 实现进程复制
const http = require('http')
const port = 8080
const url = '127.0.0.1'
// 长循环
const longComputation = () => {
let sum = 0;
for (let i = 0; i < 1e9; i++) {
sum += i
}
return sum
}
const server = http.createServer((req, res) => {
if (req.url === '/') {
return res.end('ok')
} else {
// 服务端要处理计算类型, 同步且占用着资源, 这段时间服务器是不会对处理其他请求的。
// 怎么去解决呢? 独立开个进程做这个事情
longComputation()
return res.end('after long computation, yes ok.....')
}
})
server.listen(port, url, () => console.log(`server started at http://${url}:${port}`)) 如何单开个进程处理?
// main.js 主进程
const http = require('http')
const port = 8080
const url = '127.0.0.1'
const { fork } = require('child_process');
const server = http.createServer((req, res) => {
if (req.url === '/') {
return res.end('ok')
} else {
const compute = fork('child.js') // 子进程去执行计算, 此时主进程事件循环不会被阻塞
compute.send('start')
console.log('1. 子进程开始处理')
compute.on('message', sum => { // 子进程监听message事件, 并处理后续
console.log('3. 最后处理结果返回')
res.end(`Sum is ${sum}`)
})
}
})
server.listen(port, url, () => console.log(`server started at http://${url}:${port}`)) // child.js 子进程
/**
* 该进程做计算的事情
*/
const longComputation = () => {
let sum = 0;
for (let i = 0; i < 10000; i++) {
sum += i
}
return sum
}
// 全局注册事件 process是 EventEmitter实例
process.on('message', msg => {
var sum = longComputation()
console.log('2. 子进程处理后 传给父进程', sum)
process.send(sum) // 当完成肠循环后, 发送信息给父进程
}) |
5 - cluster 利用负载均衡 / 子进程集群创建进程 / 父子进程通信
// 主(父)进程 master 管理 多个子进程 worker, 实现集群功能
var cluster = require('cluster')
var http = require('http')
var numCPUs = require('os').cpus().length // 获取CPU的个数
// 主进程
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork()
}
// cluster 是个EventEmitter
// cluster.workers 里面所有的子进程信息
for (let workerId in cluster.workers) {
// 子进程: 订阅者模式
cluster.workers[workerId].on('message', data => {
console.log('每个子进程绑定事件回调: ', data.msg) // 输出 'process.send 从父传给子'
})
}
return
}
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n")
// 父进程: 发布信息给子
process.send({ msg: 'process.send 从父传给子' })
}).listen(8000) cluster & fork 区别?
负载均衡
|
6 - cluster 工作原理 TODO框架: master 进程下HTTP代理服务器 + 多个worker 进程的多个 HTTP代理服务器
问题: 主master 监听了8080? 那么cluster fork出来的 是不是占用了8080端口?
|
7 - Express 和 Koa 的区别异步流程控制
错误处理
|
8 - Node 知道些什么?child_process & cluster
EventEmitter 事件循环机制
同步 > process.nextTick > 微队列 (promise.then) > setImmidate(check) > 宏队列 ( timers: setTimeout/setInterval) 总结
https://blog.fundebug.com/2019/01/15/diffrences-of-browser-and-node-in-event-loop/ |
Vue.nextTick 约等于 this.setState
|
1 - 进程 & 线程
对于浏览器来说,为什么设计JS是单线程?
2 - Common.js Node模块化经历了什么?
The text was updated successfully, but these errors were encountered: