博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AI考拉技术分享会--Node.js并发模型
阅读量:6915 次
发布时间:2019-06-27

本文共 1500 字,大约阅读时间需要 5 分钟。

前言

上回书说到Node.js内存模型的相关内容,这次,我们往node的另一模型,并发模型进行分享,考拉技术小哥哥Nick结合了网红奶茶一点点的例子,给大家带来一场视觉与味觉的盛宴。

并发模型是什么

首先,什么是并发?

并发是指程序可以同时处理多个任务,是一个web 服务必备的能力。

自从 Nodejs 出现后,js 开始涉及后端领域,因为其出色的并发模型,被很多企业用来处理高并发请求,例如淘宝已经大量使用 node 处理中间层业务。

接下来本文就分析一下 js 的并发模型,来理解 node 相对于其他语言的优势以及其最合适的应用场景

tips:并发和并行区别

异步IO

什么是异步IO?

  • 异步 IO 具体是如何实现的呢?
  • 异步和同步有什么区别呢?
  • 异步就不阻塞吗?IO 阻塞又是什么概念呢?

带着这些问题,我们慢慢分析。

IO 模型

《UNIX网络编程:卷一》第六章——I/O复用。书中向我们提及了5种类UNIX下可用的I/O模型:

  • 阻塞式I/O;
  • 非阻塞式I/O;
  • I/O复用(select,poll,epoll...);
  • 信号驱动式I/O(SIGIO);
  • 异步I/O(POSIX的aio_系列函数);

总结一下阻塞,非阻塞,同步,异步:

  • 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;
  • 同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写。

说人话

上面的解释太复杂我看不懂怎么办?我们把上文说到 IO 代入到生活的场景中,考虑到我们公司很多人喜欢买一点点饮料,就以买饮料为例,将四种常见 IO 模型转换为对应的买饮料流程。下面是一下设定:

  • 把买一杯一点点的流程简化为两步:下单制作和拿一点点回公司
  • 公司员工 === 线程
  • 下单制作 === 发起IO请求
  • 拿一点点回公司 === 读取数据

异步 IO 的特点就是把 IO 处理的事情都交给了操作系统(美团外卖),这样线程就不会被 IO 阻塞,可以继续处理其他请求。

Node 的异步IO

Node.js 的异步 IO 由 Libuv 这个库提供实现,Libuv 是 Node.js 关键的一个组成部分,它为上层的 Node.js 提供了统一的 API 调用,使其不用考虑平台差距,隐藏了底层实现。

可以看出,它提供了非阻塞的网络 I/O,异步文件系统访问等功能,而且右下角居然还有个线程池,实际上 Libuv 收到的 IO 请求是同个多线程来实现的, 看来 Node 只是在程序层面单线程而已。

事件循环

任务队列

先看看 Node.js 结构:

根据上图,Node.js的运行机制如下:

(1)V8引擎解析JavaScript脚本。

(2)解析后的代码,调用Node API。

(3)libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎(callback 处理结果)。

(4)V8引擎再将结果返回给用户。

异步操作都会被压入任务队列,当任务队列为空的时候,程序退出。

总结

Libuv 使用异步IO + 线程池实现的事件循环处理机制提供的高效的 IO 处理,是 Node 能承担高并发请求的主要原因。

参考文章与书籍

  • 《深入浅出Node.js》
  • 《Unix 网络编程》
  • 《七周七并发模型》

Nick小哥哥将内容整理到自己的博客中,欢迎大家前往学习交流:

著作权归本文作者所有,未经授权,请勿转载,谢谢。

你可能感兴趣的文章
HTTPS时代的到来是大势所趋!阿里云CDN如何助力企业网站进入HTTPS时代
查看>>
Linux 积极使用swap空间
查看>>
等待事件之Log File Sync
查看>>
php测试kafka
查看>>
js获取两个日期之间时间差(天数)
查看>>
Memcached 简介
查看>>
虚拟化二、Xen虚拟化技术
查看>>
Oracle 11g数据库随系统自动启动与关闭的设置方法
查看>>
git pull force
查看>>
使用new操作符来调用一个构造函数的时候发生了什么
查看>>
交换机配置vlan 访问控制列表
查看>>
Python面向对象之类的成员
查看>>
Win8上iis配置
查看>>
Confluence 6 配置 Office 转换器
查看>>
Grin交易原理详解
查看>>
大数据体系【概念认知】系列-2:存储以及副本策略
查看>>
Apache与Tomcat区别联系
查看>>
用shell编写批量打包日志脚本
查看>>
传统的MapReduce框架慢在那里
查看>>
20个java异常处理最佳实践
查看>>